In this notebook we conduct exploratory factor analyses (EFAs) on the datasets for our studies of concepts of mental life, in which each participants judged the various mental capacities of a particular target entity. We analyze datasets for adults and children from each of our five field sites: the US, Ghana, Thailand, China, and Vanuatu.

This notebook contains the results presented in the main text, in which we use Pearson correlations with our three-point response scale (no = 0, kinda = 0.5, yes = 1); see supplemental analyses for a version of these analyses treating kinda = yes = 1 and using tetrachoric correlations.

Adults

Samples

  country   n
       US 127
    Ghana 150
 Thailand 150
    China 136
  Vanuatu 148
    Total 711

Scale use

Factor retention: parallel analysis

Exploratory factor analysis

The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyconvergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefully

Factor loadings

the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Congruence

funs() is soft deprecated as of dplyr 0.8.0
Please use a list of either functions or lambdas: 

  # Simple named list: 
  list(mean = mean, median = median)

  # Auto named with `tibble::lst()`: 
  tibble::lst(mean, median)

  # Using lambdas
  list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
This warning is displayed once per session.

Bootstrapped congruence

Children

Samples

  country   n
       US 117
    Ghana 150
 Thailand 152
    China 131
  Vanuatu 143
    Total 693

Scale use

Factor retention: parallel analysis

Exploratory factor analysis

The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyconvergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyconvergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyconvergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.

Factor loadings

the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Congruence

See All samples, below.

Bootstrapped congruence

All samples

Congruence

the condition has length > 1 and only the first element will be usedVectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.the condition has length > 1 and only the first element will be usedVectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Jaccard Similarity

the condition has length > 1 and only the first element will be usedVectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.the condition has length > 1 and only the first element will be usedVectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Developmental comparisons

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Other metrics of similarity

[1] 0.6086957

Variance accounted for

Interfactor correlations

US ADULTS
          F1        F2        F3
F1 1.0000000 0.5114648 0.4805622
F2 0.5114648 1.0000000 0.5376676
F3 0.4805622 0.5376676 1.0000000
          F1        F2        F3
F1 1.0000000 0.2615963 0.2309400
F2 0.2615963 1.0000000 0.2890864
F3 0.2309400 0.2890864 1.0000000

US CHILDREN
          F1        F2        F3
F1 1.0000000 0.3031865 0.4334098
F2 0.3031865 1.0000000 0.4856172
F3 0.4334098 0.4856172 1.0000000
           F1         F2        F3
F1 1.00000000 0.09192203 0.1878441
F2 0.09192203 1.00000000 0.2358240
F3 0.18784410 0.23582402 1.0000000
GHANA ADULTS
          F1        F2        F3
F1 1.0000000 0.2725881 0.3444798
F2 0.2725881 1.0000000 0.2558207
F3 0.3444798 0.2558207 1.0000000
           F1         F2         F3
F1 1.00000000 0.07430429 0.11866634
F2 0.07430429 1.00000000 0.06544426
F3 0.11866634 0.06544426 1.00000000

GHANA CHILDREN
          F1        F2        F3
F1 1.0000000 0.5790820 0.1747165
F2 0.5790820 1.0000000 0.3854114
F3 0.1747165 0.3854114 1.0000000
           F1       F2         F3
F1 1.00000000 0.335336 0.03052585
F2 0.33533601 1.000000 0.14854196
F3 0.03052585 0.148542 1.00000000
THAILAND ADULTS
          F1        F2        F3
F1 1.0000000 0.4142881 0.3218404
F2 0.4142881 1.0000000 0.4161488
F3 0.3218404 0.4161488 1.0000000
          F1        F2        F3
F1 1.0000000 0.1716346 0.1035813
F2 0.1716346 1.0000000 0.1731798
F3 0.1035813 0.1731798 1.0000000

THAILAND CHILDREN
             F1         F2        F3           F4
F1  1.000000000 0.54189979 0.1468730 -0.008909088
F2  0.541899792 1.00000000 0.3169020  0.092978779
F3  0.146873030 0.31690205 1.0000000  0.269117295
F4 -0.008909088 0.09297878 0.2691173  1.000000000
             F1          F2         F3           F4
F1 1.000000e+00 0.293655384 0.02157169 7.937185e-05
F2 2.936554e-01 1.000000000 0.10042691 8.645053e-03
F3 2.157169e-02 0.100426907 1.00000000 7.242412e-02
F4 7.937185e-05 0.008645053 0.07242412 1.000000e+00
CHINA ADULTS
          F1        F2        F3
F1 1.0000000 0.4590388 0.6187141
F2 0.4590388 1.0000000 0.3703614
F3 0.6187141 0.3703614 1.0000000
          F1        F2        F3
F1 1.0000000 0.2107166 0.3828072
F2 0.2107166 1.0000000 0.1371675
F3 0.3828072 0.1371675 1.0000000

CHINA CHILDREN
          F1         F2        F3         F4
F1 1.0000000 0.51249526 0.3245885 0.25786749
F2 0.5124953 1.00000000 0.1524842 0.07635739
F3 0.3245885 0.15248416 1.0000000 0.13450834
F4 0.2578675 0.07635739 0.1345083 1.00000000
           F1          F2         F3          F4
F1 1.00000000 0.262651390 0.10535767 0.066495642
F2 0.26265139 1.000000000 0.02325142 0.005830451
F3 0.10535767 0.023251420 1.00000000 0.018092495
F4 0.06649564 0.005830451 0.01809249 1.000000000
VANUATU ADULTS
         F1       F2
F1 1.000000 0.687325
F2 0.687325 1.000000
          F1        F2
F1 1.0000000 0.4724157
F2 0.4724157 1.0000000

VANUATU CHILDREN
          F1        F2        F3
F1 1.0000000 0.3116574 0.5189923
F2 0.3116574 1.0000000 0.3362370
F3 0.5189923 0.3362370 1.0000000
           F1         F2        F3
F1 1.00000000 0.09713036 0.2693530
F2 0.09713036 1.00000000 0.1130554
F3 0.26935296 0.11305535 1.0000000
LS0tCnRpdGxlOiAiQ29uY2VwdHMgb2YgbWVudGFsIGxpZmUgYWNyb3NzIGN1bHR1cmVzOiBQcmltYXJ5IGFuYWx5c2lzIgphdXRob3JzOiAiV2Vpc21hbiwgTGVnYXJlLCAmIEx1aHJtYW5uIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEYsIG1lc3NhZ2UgPSBGKQpgYGAKCkluIHRoaXMgbm90ZWJvb2sgd2UgY29uZHVjdCBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzZXMgKEVGQXMpIG9uIHRoZSBkYXRhc2V0cyBmb3Igb3VyIHN0dWRpZXMgb2YgY29uY2VwdHMgb2YgbWVudGFsIGxpZmUsIGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnRzIGp1ZGdlZCB0aGUgdmFyaW91cyBtZW50YWwgY2FwYWNpdGllcyBvZiBhIHBhcnRpY3VsYXIgdGFyZ2V0IGVudGl0eS4gV2UgYW5hbHl6ZSBkYXRhc2V0cyBmb3IgYWR1bHRzIGFuZCBjaGlsZHJlbiBmcm9tIGVhY2ggb2Ygb3VyIGZpdmUgZmllbGQgc2l0ZXM6IHRoZSBVUywgR2hhbmEsIFRoYWlsYW5kLCBDaGluYSwgYW5kIFZhbnVhdHUuIAoKVGhpcyBub3RlYm9vayBjb250YWlucyB0aGUgcmVzdWx0cyBwcmVzZW50ZWQgaW4gdGhlIG1haW4gdGV4dCwgaW4gd2hpY2ggd2UgdXNlIFBlYXJzb24gY29ycmVsYXRpb25zIHdpdGggb3VyIHRocmVlLXBvaW50IHJlc3BvbnNlIHNjYWxlIChubyA9IDAsIGtpbmRhID0gMC41LCB5ZXMgPSAxKTsgc2VlIHN1cHBsZW1lbnRhbCBhbmFseXNlcyBmb3IgYSB2ZXJzaW9uIG9mIHRoZXNlIGFuYWx5c2VzIHRyZWF0aW5nIGtpbmRhID0geWVzID0gMSBhbmQgdXNpbmcgdGV0cmFjaG9yaWMgY29ycmVsYXRpb25zLgoKCmBgYHtyLCBlY2hvID0gRiwgbWVzc2FnZSA9IEZ9CnNvdXJjZSgiLi9zY3JpcHRzL2RlcGVuZGVuY2llcy5SIikKc291cmNlKCIuL3NjcmlwdHMvY3VzdG9tX2Z1bnMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Zhcl9yZWNvZGVfY29udHJhc3QuUiIpCmBgYAoKYGBge3IgZGF0YX0KIyByZWFkIGluIGRhdGEsIHNob3J0ZW4gImZlZWwgc2ljaywiIGFuZCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBhZHVsdHMKZF91c19hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF91c19hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfZ2hfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfZ2hfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX3RoX2FkdWx0cyA8LSByZWFkX2NzdigiLi4vZGF0YS9kX3RoX2FkdWx0cy5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF9jaF9hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9jaF9hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdnRfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdnRfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQoKIyByZWFkIGluIGRhdGEsIHNob3J0ZW4gImZlZWwgc2ljaywiIGFuZCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBjaGlsZHJlbgpkX3VzX2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdXNfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfZ2hfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9naF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKIyBkX2doX2VuZ19jaGlsZHJlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9kX2doX2VuZ19jaGlsZHJlbi5jc3YiKSAlPiUKIyAgIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiMgICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdGhfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF90aF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF9jaF9jaGlsZHJlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9kX2NoX2NoaWxkcmVuLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX3Z0X2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdnRfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpICU+JQogICMgZmlsdGVyIG91dCBwYXJ0aWNpcGFudHMgb3V0c2lkZSBvZiB0aGUgYWdlIHJhbmdlCiAgZmlsdGVyKChhZ2UgPj0gNiAmIGFnZSA8PSAxMikgfCBpcy5uYShhZ2UpKQpgYGAKCmBgYHtyIHdpZGV9CiMgbWFrZSB3aWRlLWZvcm0gZGF0YXNldHMgZm9yIEVGQTogYWR1bHRzCmRfdXNfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF91c19hZHVsdHMpCmRfZ2hfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9hZHVsdHMpCmRfdGhfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF90aF9hZHVsdHMpCmRfY2hfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF9jaF9hZHVsdHMpCmRfdnRfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF92dF9hZHVsdHMpCgojIG1ha2Ugd2lkZS1mb3JtIGRhdGFzZXRzIGZvciBFRkE6IGNoaWxkcmVuCmRfdXNfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3VzX2NoaWxkcmVuKQpkX2doX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9jaGlsZHJlbikKIyBkX2doX2VuZ19jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfZ2hfZW5nX2NoaWxkcmVuKQpkX3RoX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF90aF9jaGlsZHJlbikKZF9jaF9jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfY2hfY2hpbGRyZW4pCmRfdnRfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3Z0X2NoaWxkcmVuKQpgYGAKCgojIEFkdWx0cwoKIyMgU2FtcGxlcwoKYGBge3Igc2FtcGxlcyBhZHVsdHN9CmJpbmRfcm93cyhkX3VzX2FkdWx0cywgZF9naF9hZHVsdHMsIGRfdGhfYWR1bHRzLCBkX2NoX2FkdWx0cywgZF92dF9hZHVsdHMpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCkgJT4lCiAgY291bnQoY291bnRyeSkgJT4lCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCkKYGBgCgojIyBTY2FsZSB1c2UKCmBgYHtyIHNjYWxlIHVzZSBtZWFuIG92ZXJhbGwgYWR1bHRzfQpiaW5kX3Jvd3MoZF91c19hZHVsdHMsIGRfZ2hfYWR1bHRzLCBkX3RoX2FkdWx0cywgZF9jaF9hZHVsdHMsIGRfdnRfYWR1bHRzKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgIHJlc3BvbnNlX2NhdCA9IHJlY29kZV9mYWN0b3IocmVzcG9uc2VfY2F0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyIgPSAibm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJraW5kIG9mIiA9ICJraW5kIG9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVzIiA9ICJ5ZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9ICJtaXNzaW5nIGRhdGEiKSkgJT4lCiAgY291bnQoY291bnRyeSwgcmVzcG9uc2VfY2F0KSAlPiUKICBjb21wbGV0ZShyZXNwb25zZV9jYXQsIG5lc3RpbmcoY291bnRyeSksIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KC1uKSAlPiUKICBzcHJlYWQocmVzcG9uc2VfY2F0LCBwcm9wKSAlPiUKICBqYW5pdG9yOjphZG9ybl9wY3RfZm9ybWF0dGluZyhkaWdpdHMgPSAyKQpgYGAKCiMjIEZhY3RvciByZXRlbnRpb246IHBhcmFsbGVsIGFuYWx5c2lzCgpgYGB7ciBwYXJhbGxlbCBkaXN0IGFkdWx0cywgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNX0KIyBOT1RFOiB0aGVyZSBhcHBlYXJzIHRvIGJlIHNvbWUgdW5yZWxpYWJpbGl0eS9ub24tcmVwcm9kdWNpYmlsaXR5IGluIHJlc3VsdHMsIGVzcGVjaWFsbHkgZm9yIHZ0IGFkdWx0cywgd2hpY2ggSSBkb24ndCB1bmRlcnN0YW5kIC0tIHNvIGhlcmUncyB0aGUgZGlzdHJpYnV0aW9uIG92ZXIgb3V0Y29tZXMgb2YgcGFyYWxsZWwgYW5hbHlzaXMgd2l0aCAxMDAgaXRlcmF0aW9ucy4gV2UnbGwgY2hvb3NlIHRoZSBtZWRpYW4gbnVtYmVyIG9mIGZhY3RvcnMuCgppZiAoZmlsZS5leGlzdHMoIi4uL3Jlc3VsdHMvcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMuUkRTIikpIHsKICAKICBwYV9vdXRjb21lc19kaXN0X2FkdWx0cyA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfYWR1bHRzLlJEUyIpCiAgCn0gZWxzZSB7CiAgCiAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMgPC0gZGF0YS5mcmFtZSh1cyA9IE5VTEwsIGdoID0gTlVMTCwgdGggPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBOVUxMLCB2dCA9IE5VTEwpCiAgCiAgc2V0LnNlZWQoNTQzMjEpCiAgbl9jb3JlcyA8LSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKQogIG9wdGlvbnMobWMuY29yZXMgPSBuX2NvcmVzKQogIAogIGZvciAoaSBpbiAxOjEwMCkgewogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgInVzIl0gPC0gZmEucGFyYWxsZWwoZF91c19hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2FkdWx0c1tpLCAiZ2giXSA8LSBmYS5wYXJhbGxlbChkX2doX2FkdWx0c193LCBwbG90ID0gRikkbmZhY3QgICAgIAogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgInRoIl0gPC0gZmEucGFyYWxsZWwoZF90aF9hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2FkdWx0c1tpLCAiY2giXSA8LSBmYS5wYXJhbGxlbChkX2NoX2FkdWx0c193LCBwbG90ID0gRikkbmZhY3QKICAgIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzW2ksICJ2dCJdIDwtIGZhLnBhcmFsbGVsKGRfdnRfYWR1bHRzX3csIHBsb3QgPSBGKSRuZmFjdAogIH0KICAKICBzYXZlUkRTKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzLCBmaWxlID0gIi4uL3Jlc3VsdHMvcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMuUkRTIikKfQoKIyBwbG90CnBhX291dGNvbWVzX2Rpc3RfYWR1bHRzICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiaXRlciIpICU+JQogIGdhdGhlcihjb3VudHJ5LCBuZmFjdCwgLWl0ZXIpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2giLCAidGgiLCAiY2giLCAidnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHNfY291bnRyeSkpICU+JQogIGdncGxvdChhZXMoeCA9IG5mYWN0KSkgKwogIGZhY2V0X2dyaWQofiBjb3VudHJ5KSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJjb3VudCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxLCBtYXgocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMpICsgMSksCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCAxMDAsIDEpKSArCiAgbGFicyh4ID0gIk51bWJlciBvZiBmYWN0b3JzIHN1Z2dlc3RlZCBieSBmYS5wYXJhbGxlbCgpIikKYGBgCgojIyBFeHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMKCmBgYHtyIGVmYSBhZHVsdHN9CnNldC5zZWVkKDU0MzIxKQoKIyBkbyBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXM6IGFkdWx0cwplZmFfdXNfYWR1bHRzIDwtIGZhX2Z1bihkX3VzX2FkdWx0c193LAogICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJHVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV91c19hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgidXNBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdXNfYWR1bHRzJGxvYWRpbmdzKSkKCmVmYV9naF9hZHVsdHMgPC0gZmFfZnVuKGRfZ2hfYWR1bHRzX3csIAogICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJGdoKSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV9naF9hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgiZ2hBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzKSkKCmVmYV90aF9hZHVsdHMgPC0gZmFfZnVuKGRfdGhfYWR1bHRzX3csIAogICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJHRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV90aF9hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgidGhBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdGhfYWR1bHRzJGxvYWRpbmdzKSkKCmVmYV9jaF9hZHVsdHMgPC0gZmFfZnVuKGRfY2hfYWR1bHRzX3csIAogICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJGNoKSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgiY2hBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfY2hfYWR1bHRzJGxvYWRpbmdzKSkKCmVmYV92dF9hZHVsdHMgPC0gZmFfZnVuKGRfdnRfYWR1bHRzX3csIAogICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJHZ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV92dF9hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgidnRBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdnRfYWR1bHRzJGxvYWRpbmdzKSkKYGBgCgpgYGB7ciBmYWN0b3IgbmFtZXMgYWR1bHRzfQpmYWN0b3JfbmFtZXNfYWR1bHRzIDwtIGRhdGEuZnJhbWUoZmFjdG9yID0gYyhjb2xuYW1lcyhlZmFfdXNfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2doX2FkdWx0cyRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV90aF9hZHVsdHMkbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfY2hfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3Z0X2FkdWx0cyRsb2FkaW5ncykpKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gImFkdWx0cyIpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gY2FzZV93aGVuKGdyZXBsKCJedXMiLCBmYWN0b3IpIH4gIlVTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXmdoIiwgZmFjdG9yKSB+ICJHaGFuYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl50aCIsIGZhY3RvcikgfiAiVGhhaWxhbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJeY2giLCBmYWN0b3IpIH4gIkNoaW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXnZ0IiwgZmFjdG9yKSB+ICJWYW51YXR1IiksCiAgICAgICAgIGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBtdXRhdGUoZmFjdG9yX25hbWUgPSBnc3ViKCJedXMiLCAiVVMgIiwgZmFjdG9yKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeZ2giLCAiR2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJedGgiLCAiVGguICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeY2giLCAiQ2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJednQiLCAiVmEuICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJBRFVMVFMiLCAiYWR1bHRzIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl9GIiwgIiBGYWN0b3IgIiwgZmFjdG9yX25hbWUpKSAlPiUKICBtdXRhdGUoZmFjdG9yX2Rlc2NyaXB0ID0gcmVjb2RlKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzQURVTFRTX0YxID0gIkJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNBRFVMVFNfRjIgPSAiSGVhcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNBRFVMVFNfRjMgPSAiTWluZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaEFEVUxUU19GMSA9ICJJbm5lciBzcGhlcmUgKG1pbmQtbGlrZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hBRFVMVFNfRjIgPSAiQm9keS1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQURVTFRTX0YzID0gIkludGVycGVyc29uYWwsIHJlbGlnaW91cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aEFEVUxUU19GMSA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhBRFVMVFNfRjIgPSAiSGVhcnQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aEFEVUxUU19GMyA9ICJNaW5kLWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hBRFVMVFNfRjEgPSAiSGVhcnQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaEFEVUxUU19GMiA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hBRFVMVFNfRjMgPSAiTWluZC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0QURVTFRTX0YxID0gIkhhcm1vbnkgKG1pbmQtbGlrZSwgaGVhcnQtbGlrZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRBRFVMVFNfRjIgPSAiU2luIChib2R5LWxpa2UpIiksCiAgICAgICAgIGZhY3Rvcl9sYWJkZXNjcmlwdCA9IHBhc3RlKGdzdWIoIi4qX0YiLCAiRiIsIGZhY3RvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9kZXNjcmlwdCwgc2VwID0gIjogIikpCmBgYAoKIyMgRmFjdG9yIGxvYWRpbmdzCgpgYGB7ciBvcmRlciBhZHVsdHN9CiMgb3JkZXIgY2FwYWNpdGllczogYWR1bHRzCm9yZGVyX3VzX2FkdWx0cyA8LSBmYS5zb3J0KGVmYV91c19hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfZ2hfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX2doX2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl90aF9hZHVsdHMgPC0gZmEuc29ydChlZmFfdGhfYWR1bHRzKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2NoX2FkdWx0cyA8LSBmYS5zb3J0KGVmYV9jaF9hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfdnRfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX3Z0X2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpgYGAKCmBgYHtyIGxvYWRpbmdzIGFkdWx0c30KIyBjb21waWxlIGxvYWRpbmdzOiBhZHVsdHMKbG9hZGluZ3NfYWR1bHRzIDwtIGJpbmRfcm93cygKICBsb2FkaW5nc19mdW4oZWZhX3VzX2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlVTIiksCiAgbG9hZGluZ3NfZnVuKGVmYV9naF9hZHVsdHMpICU+JSBtdXRhdGUoY291bnRyeSA9ICJHaGFuYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdGhfYWR1bHRzKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiVGhhaWxhbmQiKSwKICBsb2FkaW5nc19mdW4oZWZhX2NoX2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIkNoaW5hIiksCiAgbG9hZGluZ3NfZnVuKGVmYV92dF9hZHVsdHMpICU+JSBtdXRhdGUoY291bnRyeSA9ICJWYW51YXR1IikpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3VzID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl91c19hZHVsdHMpLAogICAgICAgICBjYXBhY2l0eV9vcmRfZ2ggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX2doX2FkdWx0cyksCiAgICAgICAgIGNhcGFjaXR5X29yZF90aCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdGhfYWR1bHRzKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX2NoID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl9jaF9hZHVsdHMpLAogICAgICAgICBjYXBhY2l0eV9vcmRfdnQgPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3Z0X2FkdWx0cykpICU+JQogIGFycmFuZ2UoY291bnRyeSwgZmFjdG9yLCBkZXNjKGFicyhsb2FkaW5nKSksIGNhcGFjaXR5KSAlPiUKICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzKQpgYGAKCmBgYHtyIGhlYXRtYXBzIGJ5IHNpdGUgYWR1bHRzLCBmaWcud2lkdGggPSAxNSwgZmlnLmFzcCA9IDAuMjV9CnBsb3RfZ3JpZChoZWF0bWFwX2Z1bihlZmFfdXNfYWR1bHRzLCAKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJVUyIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlVTOiBhZHVsdHMiKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV9naF9hZHVsdHMsCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiR2hhbmEiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZhY3Rvcl9sYWJkZXNjcmlwdCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpKSArIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJHSEFOQTogYWR1bHRzIiksCiAgICAgICAgICBoZWF0bWFwX2Z1bihlZmFfdGhfYWR1bHRzLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIlRoYWlsYW5kIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVEhBSUxBTkQ6IGFkdWx0cyIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX2NoX2FkdWx0cywKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJDaGluYSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIkNISU5BOiBhZHVsdHMiKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV92dF9hZHVsdHMsCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiVmFudWF0dSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlZBTlVBVFU6IGFkdWx0cyIpLAogICAgICAgICAgbmNvbCA9IDUpCmBgYAoKYGBge3IgaGVhdG1hcCBhZHVsdHMsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CiMgbWFrZSBoZWF0bWFwIGZpZ3VyZTogYWR1bHRzCmxvYWRpbmdzX2FkdWx0cyAlPiUKICBtdXRhdGUoZmFjdG9yX251bSA9IGFzLm51bWVyaWMoZ3N1YigiLipGIiwgIiIsIGZhY3RvcikpKSAlPiUKICBtdXRhdGUoc2FtcGxlID0gcGFzdGUoY291bnRyeSwgImFkdWx0cyIsIHNlcCA9ICJcbiIpKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cykgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdCwgZmFjdG9yX251bSksIAogICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3VzKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9lYykpLCAKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2doKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF90aCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfY2gpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3Z0KSksCiAgICAgICAgICAgICBmaWxsID0gbG9hZGluZykpICsKICBmYWNldF9ncmlkKH4gcmVvcmRlcihzYW1wbGUsIGFzLm51bWVyaWMoY291bnRyeSkpLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gMjAsIGJhcndpZHRoID0gMC41KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoMC44LCAibGluZXMiKSwKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiQ2FwYWNpdHkiLCBmaWxsID0gIkZhY3RvclxubG9hZGluZyIpCmBgYAoKIyMgQ29uZ3J1ZW5jZQoKYGBge3IgY29uZ3J1ZW5jZSBhZHVsdHN9CmNvbmdfYWR1bHRzIDwtIGZhLmNvbmdydWVuY2UoeCA9IGxpc3QoZWZhX3VzX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV90aF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdnRfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSA1KSAlPiUKICAjIGdldF91cHBlcl90cmlfZnVuKCkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKSAlPiUKICBnYXRoZXIoZmFjdG9yX0IsIGNvbmcsIC1mYWN0b3JfQSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgIHJlbmFtZV9hbGwobGlzdCh+IChwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSkpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICByZW5hbWVfYWxsKGxpc3QofiAocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSkpKQpgYGAKCmBgYHtyIHRvcCBtYXRjaCBhZHVsdHN9CmNvbmdfYWR1bHRzX3RvcF9tYXRjaF9BIDwtIHRvcF9tYXRjaF9mdW4oY29uZ19hZHVsdHMsICJjb3VudHJ5X0EiKQpjb25nX2FkdWx0c190b3BfbWF0Y2hfQiA8LSB0b3BfbWF0Y2hfZnVuKGNvbmdfYWR1bHRzLCAiY291bnRyeV9CIikKYGBgCgpgYGB7ciBjb25nIGFsbCBwYWlycyBhZHVsdHMsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CmNvbmdfYWR1bHRzICU+JQogIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICB2YXJzKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSwKICAgIGZ1bnMoZ3N1YigiIFxcKCIsICJcblxcKCIsIC4pKSkgJT4lCiAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgZnVucyhnc3ViKCJcXC8iLCAiXFwvXG4iLCAuKSkpICU+JQogICMgbGVmdF9qb2luKGNvbmdfYWR1bHRzX3RvcF9tYXRjaF9BICU+JSByZW5hbWUodG9wX21hdGNoX0EgPSB0b3BfbWF0Y2gpKSAlPiUKICBsZWZ0X2pvaW4oY29uZ19hZHVsdHNfdG9wX21hdGNoX0IgJT4lIHJlbmFtZSh0b3BfbWF0Y2hfQiA9IHRvcF9tYXRjaCkpICU+JQogIG11dGF0ZShpc190b3BfbWF0Y2ggPSBjYXNlX3doZW4oZmFjdG9yX0EgPT0gZmFjdG9yX0IgfiAiYm9sZC5pdGFsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmYWN0b3JfQSA9PSB0b3BfbWF0Y2hfQSB+ICJib2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9CID09IHRvcF9tYXRjaF9CIH4gImJvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJwbGFpbiIpKSAlPiUKICAjIG11dGF0ZShjb25nID0gaWZlbHNlKGNvbmcgPT0gMSwgTkFfcmVhbF8sIGNvbmcpKSAlPiUKICBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZSh0b3VwcGVyKGNvdW50cnlfQSksICJhZHVsdHMiLCBzZXAgPSAiOlxuIikpICU+JQogIG11dGF0ZShzYW1wbGVfQiA9IHBhc3RlKHRvdXBwZXIoY291bnRyeV9CKSwgImFkdWx0cyIsIHNlcCA9ICI6XG4iKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoY291bnRyeV9BLCBjb3VudHJ5X0IpLAogICAgICAgICAgICBmdW5zKGZhY3Rvcih0b3VwcGVyKC4pLCBsZXZlbHMgPSB0b3VwcGVyKGxldmVsc19jb3VudHJ5KSkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3JfbGFiZGVzY3JpcHRfQSwKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBkZXNjKGZhY3Rvcl9sYWJkZXNjcmlwdF9CKSksCiAgICAgICAgICAgICBmaWxsID0gY29uZykpICsKICBmYWNldF9ncmlkKHJlb3JkZXIoc2FtcGxlX0IsIGFzLm51bWVyaWMoY291bnRyeV9CKSkgfiAKICAgICAgICAgICAgICAgcmVvcmRlcihzYW1wbGVfQSwgYXMubnVtZXJpYyhjb3VudHJ5X0EpKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjYXNlX3doZW4oaXMubmEoY29uZykgfiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBmb3JtYXQocm91bmQoY29uZywgMiksIG5zbWFsbCA9IDIpKSwKICAgICAgICAgICAgICAgIGZvbnRmYWNlID0gaXNfdG9wX21hdGNoLAogICAgICAgICAgICAgICAgY29sb3IgPSBpc190b3BfbWF0Y2gpLAogICAgICAgICAgICBzaXplID0gMywgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtyZWQiLCAiZGFya2JsdWUiLCAiYmxhY2siKSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJ2aXJpZGlzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDI1LCBiYXJoZWlnaHQgPSAwLjUpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSBleHByZXNzaW9uKGl0YWxpYyhyW2NdKSkpCmBgYAoKIyMgQm9vdHN0cmFwcGVkIGNvbmdydWVuY2UKCmBgYHtyIGJvb3RzdHJhcCBjb25ncnVlbmNlIGFkdWx0c30KaWYgKGZpbGUuZXhpc3RzKCIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzX29ibGlxdWUuUkRTIikpIHsKICAKICBjb25nX2RmX2FkdWx0cyA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzX29ibGlxdWUuUkRTIikKICAKfSBlbHNlIHsKICAKICBic19hZHVsdHMgPC0gbG9hZGluZ3NfYWR1bHRzICU+JQogICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBzZWxlY3QoLWNhcGFjaXR5KSAlPiUKICAgIHNqc3RhdHM6OmJvb3RzdHJhcCgxMDAwKSAKICAKICBmYWN0b3JzIDwtIGxldmVscyhmYWN0b3IobG9hZGluZ3NfYWR1bHRzJGZhY3RvcikpCiAgCiAgY29uZ19kZl9hZHVsdHMgPC0gZGF0YS5mcmFtZShOVUxMKQogIGZvciAoaSBpbiBmYWN0b3JzKSB7CiAgICBmb3IgKGogaW4gZmFjdG9ycykgewogICAgICBjbmFtZSA8LSBwYXN0ZShpLCBqLCBzZXAgPSAiLiIpCiAgICAgIHRlbXAgPC0gYnNfYWR1bHRzICU+JQogICAgICAgIG11dGF0ZShjb25nID0gbWFwX2RibChzdHJhcCwgfmxzYTo6Y29zaW5lKGFzLmRhdGEuZnJhbWUoLngpWyxpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKC54KVssal0pKSkKICAgICAgY29uZ19kZl9hZHVsdHNbMToxMDAwLCBjbmFtZV0gPC0gdGVtcCRjb25nCiAgICB9CiAgfQogIAogIGNvbmdfZGZfYWR1bHRzIDwtIGNvbmdfZGZfYWR1bHRzICU+JQogICAgZ2F0aGVyKGZhY3Rvcl9wYWlyLCBjb25nKSAlPiUKICAgIHNlcGFyYXRlKGZhY3Rvcl9wYWlyLCBpbnRvID0gYygiZmFjdG9yX0EiLCAiZmFjdG9yX0IiKSwgc2VwID0gIlxcLiIpICU+JQogICAgZ3JvdXBfYnkoZmFjdG9yX0EsIGZhY3Rvcl9CKSAlPiUKICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihjb25nKSwKICAgICAgICAgICAgICBjaV9sb3dlciA9IGNpX2xvd2VyKGNvbmcpLAogICAgICAgICAgICAgIGNpX3VwcGVyID0gY2lfdXBwZXIoY29uZykpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSkpICU+JQogICAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSkpCiAgCiAgcm0oaSwgaiwgY25hbWUsIHRlbXAsIGZhY3RvcnMpCiAgCiAgc2F2ZVJEUyhjb25nX2RmX2FkdWx0cywgZmlsZSA9ICIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzX29ibGlxdWUuUkRTIikKfQpgYGAKCmBgYHtyIGNvbmcgbWluIGFkdWx0c30KIyBmaW5kIG1pbmltdW0gdmFsdWUgdG8gc2V0IGNvbnN0YW50IGxvd2VyIGJvdW5kIG9mIHBsb3RzCm1pbl9jb25nX2FkdWx0cyA8LSBjb25nX2RmX2FkdWx0cyAlPiUKICBzdW1tYXJpc2UobWluX2NvbmcgPSBtaW4oY2lfbG93ZXIsIG5hLnJtID0gVCkpCmBgYAoKYGBge3IgY29uZyBjaXMgdXMgYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIDMKY29uZ19wbG90X2Z1bihjb25nX2RmID0gY29uZ19kZl9hZHVsdHMsIHdoaWNoX2NvdW50cnkgPSAiVVMiKSArCiAgeWxpbShtaW5fY29uZ19hZHVsdHMkbWluX2NvbmcsIDEpICsKICAjIHlsaW0oTkEsIDEpICsKICBsYWJzKHggPSBOVUxMKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDNfb2JsaXF1ZS5wbmciKQpgYGAKCmBgYHtyIGNvbmcgY2lzIGdoIGJhc2UgYWR1bHRzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSBTMQpjb25nX3Bsb3RfZnVuKGNvbmdfZGYgPSBjb25nX2RmX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICAgICAgICAgICAgICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgICAgICAgICAgICAgICBmdW5zKGdzdWIoIiBcXCgiLCAiXG5cXCgiLCAuKSkpICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXFwvIiwgIlxcL1xuIiwgLikpKSwgCiAgICAgICAgICAgICAgd2hpY2hfY291bnRyeSA9ICJHaGFuYSIpICsKICB5bGltKG1pbl9jb25nX2FkdWx0cyRtaW5fY29uZywgMSkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwMV9vYmxpcXVlLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgdGggYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFMyCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIlRoYWlsYW5kIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzAyX29ibGlxdWUucG5nIikKYGBgCgpgYGB7ciBjb25nIGNpcyBjaCBiYXNlIGFkdWx0cywgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuOX0KIyBGSUdVUkUgUzMKY29uZ19wbG90X2Z1bihjb25nX2RmID0gY29uZ19kZl9hZHVsdHMsIAogICAgICAgICAgICAgIHdoaWNoX2NvdW50cnkgPSAiQ2hpbmEiKSArCiAgeWxpbShtaW5fY29uZ19hZHVsdHMkbWluX2NvbmcsIDEpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDNfb2JsaXF1ZS5wbmciKQpgYGAKCmBgYHtyIGNvbmcgY2lzIHZ0IGJhc2UgYWR1bHRzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSBTNApjb25nX3Bsb3RfZnVuKGNvbmdfZGYgPSBjb25nX2RmX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICAgICAgICAgICAgICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgICAgICAgICAgICAgICBmdW5zKGdzdWIoIiBcXCgiLCAiXG5cXCgiLCAuKSkpICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXFwvIiwgIlxcL1xuIiwgLikpKSwgCiAgICAgICAgICAgICAgd2hpY2hfY291bnRyeSA9ICJWYW51YXR1IikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA0X29ibGlxdWUucG5nIikKYGBgCgpgYGB7ciBib2R5IG1pbmQgY29uZyBhZHVsdHN9CiMgIkluIGVhY2ggc2FtcGxlLCB0aGVyZSB3YXMgYSBmYWN0b3IgdGhhdCB3YXMgc2ltaWxhciB0byBVUyBhZHVsdHPigJkg4oCcYm9keeKAnSBmYWN0b3IuLi4KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCgojICIuLi5hbmQgbm90IHNpbWlsYXIgdG8gdGhlIFVTIGFkdWx0IOKAnG1pbmTigJ0gZmFjdG9yLCAuLi4KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCgojICIuLi4gYW5kIGEgZmFjdG9yIHRoYXQgd2FzIG11Y2ggbW9yZSBzaW1pbGFyIHRvIFVTIGFkdWx0c+KAmSDigJxtaW5k4oCdIGZhY3Rvci4uLgpjb25nX2RmX2FkdWx0cyAlPiUgCiAgZmlsdGVyKGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpLCAKICAgICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSksCiAgICAgICAgIGNvdW50cnlfQSAhPSAiVVMiLCBjb3VudHJ5X0IgPT0gIlVTIikKCiMgIi4uLnRoYW4gdGhlIFVTIGFkdWx0IOKAnGJvZHnigJ0gZmFjdG9yLiIKY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCmBgYApgYGB7ciBoZWFydCBjb25nIGFkdWx0c30KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSksIAogICAgICAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSksCiAgICAgICAgIGNvdW50cnlfQSAlaW4lIGMoIlRoYWlsYW5kIiwgIkNoaW5hIiksIGNvdW50cnlfQiA9PSAiVVMiKQoKY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSB8IAogICAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpLAogICAgICAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSksCiAgICAgICAgIGNvdW50cnlfQSAlaW4lIGMoIlRoYWlsYW5kIiwgIkNoaW5hIiksIGNvdW50cnlfQiA9PSAiVVMiKQpgYGAKCgojIENoaWxkcmVuCgojIyBTYW1wbGVzCgpgYGB7ciBzYW1wbGVzIGNoaWxkcmVufQpiaW5kX3Jvd3MoZF91c19jaGlsZHJlbiwgZF9naF9jaGlsZHJlbiwgZF90aF9jaGlsZHJlbiwgZF9jaF9jaGlsZHJlbiwgZF92dF9jaGlsZHJlbikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkKSAlPiUKICBjb3VudChjb3VudHJ5KSAlPiUgCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCkKYGBgCgojIyBTY2FsZSB1c2UKCmBgYHtyIHNjYWxlIHVzZSBtZWFuIG92ZXJhbGwgY2hpbGRyZW59CmJpbmRfcm93cyhkX3VzX2NoaWxkcmVuLCBkX2doX2NoaWxkcmVuLCBkX3RoX2NoaWxkcmVuLCBkX2NoX2NoaWxkcmVuLCBkX3Z0X2NoaWxkcmVuKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgIHJlc3BvbnNlX2NhdCA9IHJlY29kZV9mYWN0b3IocmVzcG9uc2VfY2F0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyIgPSAibm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJraW5kIG9mIiA9ICJraW5kIG9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVzIiA9ICJ5ZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9ICJtaXNzaW5nIGRhdGEiKSkgJT4lCiAgY291bnQoY291bnRyeSwgcmVzcG9uc2VfY2F0KSAlPiUKICBjb21wbGV0ZShyZXNwb25zZV9jYXQsIG5lc3RpbmcoY291bnRyeSksIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KC1uKSAlPiUKICBzcHJlYWQocmVzcG9uc2VfY2F0LCBwcm9wKSAlPiUKICBqYW5pdG9yOjphZG9ybl9wY3RfZm9ybWF0dGluZyhkaWdpdHMgPSAyKQpgYGAKCiMjIEZhY3RvciByZXRlbnRpb246IHBhcmFsbGVsIGFuYWx5c2lzCgpgYGB7ciBwYXJhbGxlbCBkaXN0IGNoaWxkcmVuLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC41fQojIE5PVEU6IHRoZXJlIGFwcGVhcnMgdG8gYmUgc29tZSB1bnJlbGlhYmlsaXR5L25vbi1yZXByb2R1Y2liaWxpdHkgaW4gcmVzdWx0cywgZXNwZWNpYWxseSBmb3IgdnQgYWR1bHRzLCB3aGljaCBJIGRvbid0IHVuZGVyc3RhbmQgLS0gc28gaGVyZSdzIHRoZSBkaXN0cmlidXRpb24gb3ZlciBvdXRjb21lcyBvZiBwYXJhbGxlbCBhbmFseXNpcyB3aXRoIDEwMCBpdGVyYXRpb25zLiBXZSdsbCBjaG9vc2UgdGhlIG1lZGlhbiBudW1iZXIgb2YgZmFjdG9ycy4KCmlmIChmaWxlLmV4aXN0cygiLi4vcmVzdWx0cy9wYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuLlJEUyIpKSB7CiAgCiAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4uUkRTIikKICAKfSBlbHNlIHsKICAKICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuIDwtIGRhdGEuZnJhbWUodXMgPSBOVUxMLCBnaCA9IE5VTEwsIHRoID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBOVUxMLCB2dCA9IE5VTEwpCiAgCiAgc2V0LnNlZWQoNTQzMjEpCiAgbl9jb3JlcyA8LSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKQogIG9wdGlvbnMobWMuY29yZXMgPSBuX2NvcmVzKQogIAogIGZvciAoaSBpbiAxOjEwMCkgewogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAidXMiXSA8LSBmYS5wYXJhbGxlbChkX3VzX2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdAogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAiZ2giXSA8LSBmYS5wYXJhbGxlbChkX2doX2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdCAgICAgCiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJ0aCJdIDwtIGZhLnBhcmFsbGVsKGRfdGhfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJjaCJdIDwtIGZhLnBhcmFsbGVsKGRfY2hfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJ2dCJdIDwtIGZhLnBhcmFsbGVsKGRfdnRfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgfQogIAogIHNhdmVSRFMocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiwgZmlsZSA9ICIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4uUkRTIikKfQoKIyBwbG90CnBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4gJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJpdGVyIikgJT4lCiAgZ2F0aGVyKGNvdW50cnksIG5mYWN0LCAtaXRlcikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaCIsICJ0aCIsICJjaCIsICJ2dCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbmZhY3QpKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnkpICsKICBnZW9tX2JhcihzdGF0ID0gImNvdW50IikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDEsIG1heChwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuKSArIDEpLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgMTAwLCAxKSkgKwogIGxhYnMoeCA9ICJOdW1iZXIgb2YgZmFjdG9ycyBzdWdnZXN0ZWQgYnkgZmEucGFyYWxsZWwoKSIpCmBgYAoKIyMgRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzCgpgYGB7ciBlZmEgY2hpbGRyZW59CnNldC5zZWVkKDU0MzIxKQoKIyBkbyBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXM6IGNoaWxkcmVuCmVmYV91c19jaGlsZHJlbiA8LSBmYV9mdW4oZF91c19jaGlsZHJlbl93LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kdXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9uLml0ZXIgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV91c19jaGlsZHJlbiRsb2FkaW5ncykgPC0gcGFzdGUwKCJ1c0NISUxEUkVOXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdXNfY2hpbGRyZW4kbG9hZGluZ3MpKQoKZWZhX2doX2NoaWxkcmVuIDwtIGZhX2Z1bihkX2doX2NoaWxkcmVuX3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG1lZGlhbihwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuJGdoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fcm90ID0gIm9ibGltaW4iKQpjb2xuYW1lcyhlZmFfZ2hfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgiZ2hDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2doX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV90aF9jaGlsZHJlbiA8LSBmYV9mdW4oZF90aF9jaGlsZHJlbl93LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kdGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9uLml0ZXIgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV90aF9jaGlsZHJlbiRsb2FkaW5ncykgPC0gcGFzdGUwKCJ0aENISUxEUkVOXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdGhfY2hpbGRyZW4kbG9hZGluZ3MpKQoKZWZhX2NoX2NoaWxkcmVuIDwtIGZhX2Z1bihkX2NoX2NoaWxkcmVuX3csIAogICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiRjaCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX2NoX2NoaWxkcmVuJGxvYWRpbmdzKSA8LSBwYXN0ZTAoImNoQ0hJTERSRU5fIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9jaF9jaGlsZHJlbiRsb2FkaW5ncykpCgplZmFfdnRfY2hpbGRyZW4gPC0gZmFfZnVuKGRfdnRfY2hpbGRyZW5fdywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG1lZGlhbihwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuJHZ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fcm90ID0gIm9ibGltaW4iKQpjb2xuYW1lcyhlZmFfdnRfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgidnRDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3Z0X2NoaWxkcmVuJGxvYWRpbmdzKSkKYGBgCgpgYGB7ciBmYWN0b3IgbmFtZXMgY2hpbGRyZW59CmZhY3Rvcl9uYW1lc19jaGlsZHJlbiA8LSBkYXRhLmZyYW1lKGZhY3RvciA9IGMoY29sbmFtZXMoZWZhX3VzX2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfZ2hfY2hpbGRyZW4kbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV90aF9jaGlsZHJlbiRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2NoX2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdnRfY2hpbGRyZW4kbG9hZGluZ3MpKSkgJT4lCiAgbXV0YXRlKGFnZV9ncm91cCA9ICJjaGlsZHJlbiIpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gY2FzZV93aGVuKGdyZXBsKCJedXMiLCBmYWN0b3IpIH4gIlVTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXmdoIiwgZmFjdG9yKSB+ICJHaGFuYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl50aCIsIGZhY3RvcikgfiAiVGhhaWxhbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJeY2giLCBmYWN0b3IpIH4gIkNoaW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXnZ0IiwgZmFjdG9yKSB+ICJWYW51YXR1IiksCiAgICAgICAgIGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBtdXRhdGUoZmFjdG9yX25hbWUgPSBnc3ViKCJedXMiLCAiVVMgIiwgZmFjdG9yKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeZ2giLCAiR2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJedGgiLCAiVGguICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeY2giLCAiQ2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJednQiLCAiVmEuICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJDSElMRFJFTiIsICJjaGlsZHJlbiIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJfRiIsICIgRmFjdG9yICIsIGZhY3Rvcl9uYW1lKSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9kZXNjcmlwdCA9IHJlY29kZShmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0NISUxEUkVOX0YxID0gIkJvZHktbGlrZSwgbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNDSElMRFJFTl9GMyA9ICJIZWFydC1saWtlLCBwb3NpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0NISUxEUkVOX0YyID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaENISUxEUkVOX0YxID0gIkJvZHktbGlrZSwgbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hDSElMRFJFTl9GMiA9ICJNaW5kLWxpa2UsIHBvc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQ0hJTERSRU5fRjMgPSAiUHJheSwgYWRkLCBldGMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQ0hJTERSRU5fRjEgPSAiQm9keS1saWtlLCBwb3NpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aENISUxEUkVOX0YyID0gIkhlYXJ0LWxpa2UsIG5lZ2F0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQ0hJTERSRU5fRjMgPSAiTWluZC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQ0hJTERSRU5fRjQgPSAiQWRkLCBwcmF5LCBldGMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ0hJTERSRU5fRjEgPSAiSGVhcnQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0YyID0gIkJvZHktbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0YzID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0Y0ID0gIlByYXksIGV0Yy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRDSElMRFJFTl9GMSA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRDSElMRFJFTl9GMiA9ICJNaW5kLWxpa2UsIHBvc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0Q0hJTERSRU5fRjMgPSAiSGVhcnQtbGlrZSwgbmVnYXRpdmUiKSwKICAgICAgICAgZmFjdG9yX2xhYmRlc2NyaXB0ID0gcGFzdGUoZ3N1YigiLipfRiIsICJGIiwgZmFjdG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2Rlc2NyaXB0LCBzZXAgPSAiOiAiKSkKYGBgCgojIyBGYWN0b3IgbG9hZGluZ3MKCmBgYHtyIG9yZGVyIGNoaWxkcmVufQojIG9yZGVyIGNhcGFjaXRpZXM6IGNoaWxkcmVuCm9yZGVyX3VzX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX3VzX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2doX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX2doX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX3RoX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX3RoX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2NoX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX2NoX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX3Z0X2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX3Z0X2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCmBgYAoKYGBge3IgbG9hZGluZ3MgY2hpbGRyZW59CiMgY29tcGlsZSBsb2FkaW5nczogY2hpbGRyZW4KbG9hZGluZ3NfY2hpbGRyZW4gPC0gYmluZF9yb3dzKAogIGxvYWRpbmdzX2Z1bihlZmFfdXNfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJVUyIpLAogIGxvYWRpbmdzX2Z1bihlZmFfZ2hfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJHaGFuYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdGhfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJUaGFpbGFuZCIpLAogIGxvYWRpbmdzX2Z1bihlZmFfY2hfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJDaGluYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdnRfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJWYW51YXR1IikpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3VzID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl91c19jaGlsZHJlbiksCiAgICAgICAgIGNhcGFjaXR5X29yZF9naCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfZ2hfY2hpbGRyZW4pLAogICAgICAgICBjYXBhY2l0eV9vcmRfdGggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3RoX2NoaWxkcmVuKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX2NoID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl9jaF9jaGlsZHJlbiksCiAgICAgICAgIGNhcGFjaXR5X29yZF92dCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdnRfY2hpbGRyZW4pKSAlPiUKICBhcnJhbmdlKGNvdW50cnksIGZhY3RvciwgZGVzYyhhYnMobG9hZGluZykpLCBjYXBhY2l0eSkgJT4lCiAgbXV0YXRlKG9yZGVyID0gMTpucm93KC4pKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuKQpgYGAKCmBgYHtyIGhlYXRtYXBzIGJ5IHNpdGUgY2hpbGRyZW4sIGZpZy53aWR0aCA9IDE1LCBmaWcuYXNwID0gMC4yNX0KcGxvdF9ncmlkKGhlYXRtYXBfZnVuKGVmYV91c19jaGlsZHJlbiwgCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJVUyIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlVTOiBjaGlsZHJlbiIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX2doX2NoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiR2hhbmEiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZhY3Rvcl9sYWJkZXNjcmlwdCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpKSArIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJHSEFOQTogY2hpbGRyZW4iKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV90aF9jaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIlRoYWlsYW5kIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVEhBSUxBTkQ6IGNoaWxkcmVuIiksCiAgICAgICAgICBoZWF0bWFwX2Z1bihlZmFfY2hfY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJDaGluYSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIkNISU5BOiBjaGlsZHJlbiIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX3Z0X2NoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiVmFudWF0dSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlZBTlVBVFU6IGNoaWxkcmVuIiksCiAgICAgICAgICBuY29sID0gNSkKYGBgCgpgYGB7ciBoZWF0bWFwIGNoaWxkcmVuLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC43fQojIG1ha2UgaGVhdG1hcCBmaWd1cmU6IGNoaWxkcmVuCmxvYWRpbmdzX2NoaWxkcmVuICU+JQogIG11dGF0ZShmYWN0b3JfbnVtID0gYXMubnVtZXJpYyhnc3ViKCIuKkYiLCAiIiwgZmFjdG9yKSkpICU+JQogIG11dGF0ZShzYW1wbGUgPSBwYXN0ZShjb3VudHJ5LCAiY2hpbGRyZW4iLCBzZXAgPSAiXG4iKSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19jaGlsZHJlbikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdCwgZmFjdG9yX251bSksIAogICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3VzKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9lYykpLCAKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2doKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF90aCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfY2gpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3Z0KSksCiAgICAgICAgICAgICBmaWxsID0gbG9hZGluZykpICsKICBmYWNldF9ncmlkKH4gcmVvcmRlcihzYW1wbGUsIGFzLm51bWVyaWMoY291bnRyeSkpLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gMjAsIGJhcndpZHRoID0gMC41KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoMC44LCAibGluZXMiKSwKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiQ2FwYWNpdHkiLCBmaWxsID0gIkZhY3RvclxubG9hZGluZyIpCmBgYAoKIyMgQ29uZ3J1ZW5jZQoKU2VlIFtBbGwgc2FtcGxlc10sIGJlbG93LgoKIyMgQm9vdHN0cmFwcGVkIGNvbmdydWVuY2UKCmBgYHtyIGJvb3RzdHJhcCBjb25ncnVlbmNlIGNoaWxkcmVufQppZiAoZmlsZS5leGlzdHMoIi4uL3Jlc3VsdHMvY29uZ19kZl9jaGlsZHJlbl9vYmxpcXVlLlJEUyIpKSB7CiAgCiAgY29uZ19kZl9jaGlsZHJlbiA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL2NvbmdfZGZfY2hpbGRyZW5fb2JsaXF1ZS5SRFMiKQogIAp9IGVsc2UgewogIAogIGJzX2NoaWxkcmVuIDwtIGxvYWRpbmdzX2NoaWxkcmVuICU+JQogICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBmdWxsX2pvaW4obG9hZGluZ3NfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgICAgICAgICAgICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykpICU+JQogICAgc2VsZWN0KC1jYXBhY2l0eSkgJT4lCiAgICBzanN0YXRzOjpib290c3RyYXAoMTAwMCkgCiAgCiAgY29uZ19kZl9jaGlsZHJlbiA8LSBkYXRhLmZyYW1lKE5VTEwpCiAgCiAgZm9yIChrIGluIGxldmVsc19jb3VudHJ5KSB7CiAgICAKICAgIGZhY3RvcnNfY2hpbGRyZW4gPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19jaGlsZHJlbiRmYWN0b3JbCiAgICAgIGxvYWRpbmdzX2NoaWxkcmVuJGNvdW50cnkgPT0ga10pKQogICAgZmFjdG9yc19hZHVsdHMgPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19hZHVsdHMkZmFjdG9yWwogICAgICBsb2FkaW5nc19hZHVsdHMkY291bnRyeSA9PSBrXSkpCiAgICAKICAgIGZvciAoaSBpbiBmYWN0b3JzX2NoaWxkcmVuKSB7CiAgICAgIGZvciAoaiBpbiBmYWN0b3JzX2FkdWx0cykgewogICAgICAgIGNuYW1lIDwtIHBhc3RlKGksIGosIHNlcCA9ICIuIikKICAgICAgICB0ZW1wIDwtIGJzX2NoaWxkcmVuICU+JQogICAgICAgICAgbXV0YXRlKGNvbmcgPSBtYXBfZGJsKHN0cmFwLCB+bHNhOjpjb3NpbmUoYXMuZGF0YS5mcmFtZSgueClbLGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgueClbLGpdKSkpCiAgICAgICAgY29uZ19kZl9jaGlsZHJlblsxOjEwMDAsIGNuYW1lXSA8LSB0ZW1wJGNvbmcKICAgICAgfQogICAgfQogICAgCiAgICBybShpLCBqLCBjbmFtZSwgdGVtcCwgZmFjdG9yc19jaGlsZHJlbiwgZmFjdG9yc19hZHVsdHMpCiAgICAKICB9CiAgCiAgcm0oaykKICAKICBjb25nX2RmX2NoaWxkcmVuIDwtIGNvbmdfZGZfY2hpbGRyZW4gJT4lCiAgICBnYXRoZXIoZmFjdG9yX3BhaXIsIGNvbmcpICU+JQogICAgc2VwYXJhdGUoZmFjdG9yX3BhaXIsIGludG8gPSBjKCJmYWN0b3JfQSIsICJmYWN0b3JfQiIpLCBzZXAgPSAiXFwuIikgJT4lCiAgICBncm91cF9ieShmYWN0b3JfQSwgZmFjdG9yX0IpICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGNvbmcpLAogICAgICAgICAgICAgIGNpX2xvd2VyID0gY2lfbG93ZXIoY29uZyksCiAgICAgICAgICAgICAgY2lfdXBwZXIgPSBjaV91cHBlcihjb25nKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIGZ1bGxfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIG11dGF0ZShmYWN0b3JfYmhtX0EgPSBjYXNlX3doZW4oCiAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIkJvZHktbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiTWluZC1saWtlXG5jaGlsZCBmYWN0b3IiLAogICAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiSGVhcnQtbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICAgIG11dGF0ZShmYWN0b3JfYmhtX0IgPSBjYXNlX3doZW4oCiAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkxvY2FsIGFkdWx0czpcbkJvZHktbGlrZSBmYWN0b3IiLAogICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSB+ICJMb2NhbCBhZHVsdHM6XG5NaW5kLWxpa2UgZmFjdG9yIiwKICAgICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkxvY2FsIGFkdWx0czpcbkhlYXJ0LWxpa2UgZmFjdG9yIiwKICAgICAgVFJVRSB+ICJMb2NhbCBhZHVsdHM6XG5PdGhlciBmYWN0b3IiKSkKICAKICBzYXZlUkRTKGNvbmdfZGZfY2hpbGRyZW4sIGZpbGUgPSAiLi4vcmVzdWx0cy9jb25nX2RmX2NoaWxkcmVuX29ibGlxdWUuUkRTIikKfQpgYGAKCmBgYHtyIGNvbmcgbWluIGNoaWxkcmVufQojIGZpbmQgbWluaW11bSB2YWx1ZSB0byBzZXQgY29uc3RhbnQgbG93ZXIgYm91bmQgb2YgcGxvdHMKbWluX2NvbmdfY2hpbGRyZW4gPC0gY29uZ19kZl9jaGlsZHJlbiAlPiUKICBzdW1tYXJpc2UobWluX2NvbmcgPSBtaW4oY2lfbG93ZXIsIG5hLnJtID0gVCkpCmBgYAoKYGBge3IgY29uZyBjaXMgY2hpbGRyZW4sIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjR9CiMgRklHVVJFIDQKIyBmaWcuYXNwIGNob3NlbiB0byBrZWVwIGFic29sdXRlIGhlaWdodCBvZiB5LWF4aXMgcmVsYXRpdmVseSBzaW1pbGFyIGFjcm9zcyBhZHVsdHMgYW5kIGNoaWxkcmVuCmNvbmdfZGZfY2hpbGRyZW4gJT4lCiAgbXV0YXRlKHJlZ2lvbl9BID0gY2FzZV93aGVuKAogICAgY291bnRyeV9BID09ICJVUyIgfiAiU0YgQmF5IEFyZWEiLAogICAgY291bnRyeV9BID09ICJHaGFuYSIgfiAiQ2FwZSBDb2FzdCIsCiAgICBjb3VudHJ5X0EgPT0gIlRoYWlsYW5kIiB+ICJDaGlhbmcgTWFpIiwKICAgIGNvdW50cnlfQSA9PSAiQ2hpbmEiIH4gIlNoYW5naGFpIiwKICAgIGNvdW50cnlfQSA9PSAiVmFudWF0dSIgfiAiUFYgJiBNYWxla3VsYSIpKSAlPiUKICBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZShjb3VudHJ5X0EsIGFnZV9ncm91cF9BLCBzZXAgPSAiXG4iKSkgJT4lCiAgbXV0YXRlKGxhYl9BID0gcGFzdGUocGFzdGUwKHJlZ2lvbl9BLCAiLCIpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAodG91cHBlcihjb3VudHJ5X0EpLCAiOiIpLCAKICAgICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXBfQSwgc2VwID0gIlxuIikpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3Rvcl9sYWJkZXNjcmlwdF9BLCB5ID0gbWVhbikpICsKICBmYWNldF9ncmlkKGZhY3Rvcl9iaG1fQiB+IHJlb3JkZXIobGFiX0EsIGFzLm51bWVyaWMoY291bnRyeV9BKSksIAogICAgICAgICAgICAgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWVfeCIpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IDAuODUsCiAgICAgICAgICAgZmlsbCA9ICJncmF5MjAiLCBhbHBoYSA9IDAuMikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAwLjg1LCB5bWF4ID0gMC45NSwKICAgICAgICAgICBmaWxsID0gdmlyaWRpc0xpdGU6OnZpcmlkaXMoMiwgYmVnaW4gPSAwLjc1LzIsIGVuZCA9IDAuNzUpWzFdLCBhbHBoYSA9IDAuMikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAwLjk1LCB5bWF4ID0gSW5mLAogICAgICAgICAgIGZpbGwgPSB2aXJpZGlzTGl0ZTo6dmlyaWRpcygyLCBiZWdpbiA9IDAuNzUvMiwgZW5kID0gMC43NSlbMl0sIGFscGhhID0gMC4yKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC44NSwgbHR5ID0gMiwgY29sb3IgPSAiZ3JheTEwIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuOTUsIGx0eSA9IDIsIGNvbG9yID0gImdyYXkxMCIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gMywKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChtZWFuLCAyKSwgbnNtYWxsID0gMiksCiAgICAgICAgICAgICAgICB5ID0gaWZlbHNlKGNpX2xvd2VyIDwgMC4yLCBjaV91cHBlciArIDAuMDUsIGNpX2xvd2VyIC0gMC4wNSksCiAgICAgICAgICAgICAgICB2anVzdCA9IGlmZWxzZShjaV9sb3dlciA8IDAuMiwgMCwgMSkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMSwgMSwgMC4yKSwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gZXhwYW5zaW9uKGFkZCA9IDAuMDUpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBhZXN0aGV0aWNzID0gYygiY29sb3IiLCAiZmlsbCIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IDIxOjI1KSArCiAgbGFicyh4ID0gTlVMTCwKICAgICAgIHkgPSBleHByZXNzaW9uKCJTaW1pbGFyaXR5ICIoaXRhbGljKHJbY10pKSkpICsgCiAgZ3VpZGVzKGNvbG9yID0gIm5vbmUiLCBmaWxsID0gIm5vbmUiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IHNjYWxlczo6YWxwaGEoIndoaXRlIiwgMCksIGNvbG9yID0gImJsYWNrIiksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYyg1LjUsIDUuNSwgNS41LCAxNS41KSwgInBvaW50IikpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWcwNF9vYmxpcXVlLnBuZyIpCmBgYAoKYGBge3IgYm9keSBtaW5kIGNvbmcgY2hpbGRyZW59CiMgIkluIGVhY2ggc2FtcGxlLCB0aGVyZSB3YXMgYSBmYWN0b3IgdGhhdCB3YXMgbXVjaCBtb3JlIHNpbWlsYXIgdG8gbG9jYWwgYWR1bHRz4oCZIOKAnGJvZHktbGlrZeKAnSBmYWN0b3IuLi4KY29uZ19kZl9jaGlsZHJlbiAlPiUgCiAgZmlsdGVyKGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfYmhtX0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfYmhtX0IpKSkKCiMgIi4uLnRoYW4gdGhlaXIg4oCcbWluZC1saWtl4oCdIGZhY3RvciwgLi4uCmNvbmdfZGZfY2hpbGRyZW4gJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2JobV9BKSksIAogICAgICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2JobV9CKSkpCgojICIuLi4gYW5kIGEgZmFjdG9yIHRoYXQgd2FzIG11Y2ggbW9yZSBzaW1pbGFyIHRvIGxvY2FsIGFkdWx0c+KAmSDigJxtaW5kLWxpa2XigJ0gZmFjdG9yLi4uCmNvbmdfZGZfY2hpbGRyZW4gJT4lIAogIGZpbHRlcihncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2JobV9BKSksIAogICAgICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2JobV9CKSkpCgojICIuLi50aGFuIHRoZWlyIOKAnGJvZHktbGlrZeKAnSBmYWN0b3IuIgpjb25nX2RmX2NoaWxkcmVuICU+JSAKICBmaWx0ZXIoZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQSkpLCAKICAgICAgICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQikpKQpgYGAKCgojIEFsbCBzYW1wbGVzCgojIyBDb25ncnVlbmNlCgpgYGB7ciBjb25ncnVlbmNlIGFsbCBzYW1wbGVzfQpjb25nX2FsbCA8LSBmYS5jb25ncnVlbmNlKHggPSBsaXN0KGVmYV91c19hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2doX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdGhfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3Z0X2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdXNfY2hpbGRyZW4kbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2doX2NoaWxkcmVuJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV90aF9jaGlsZHJlbiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfY2hfY2hpbGRyZW4kbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3Z0X2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSA1KSAlPiUKICAjIGdldF91cHBlcl90cmlfZnVuKCkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKSAlPiUKICBnYXRoZXIoZmFjdG9yX0IsIGNvbmcsIC1mYWN0b3JfQSkgJT4lCiAgbGVmdF9qb2luKGJpbmRfcm93cyhmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSkpKSAlPiUKICBsZWZ0X2pvaW4oYmluZF9yb3dzKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSksCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSkpCmBgYAoKYGBge3IgY29uZyBhbGwgcGFpcnMgZm9ybWF0fQojIG1ha2Ugd2lkZS1mb3JtIHZlcnNpb24gb2YgZGYKY29uZ19hbGxfdyA8LSBjb25nX2FsbCAlPiUKICBzZWxlY3QoZmFjdG9yX0EsIGZhY3Rvcl9CLCBjb25nKSAlPiUKICBzcHJlYWQoZmFjdG9yX0IsIGNvbmcpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygiZmFjdG9yX0EiKQoKIyB0cmVhdCBzaW1pbGFyaXR5IG1hdHJpeCBhcyBpZiBpdCB3ZXJlIHRoZSBjb3JyZWxhdGlvbiBtYXRyaXggZm9yIGhjbHVzdApyb3cub3JkZXIgPC0gaGNsdXN0KGFzLmRpc3QoKDEgLSBjb25nX2FsbF93KS8yKSkkb3JkZXIKY29sLm9yZGVyIDwtIGhjbHVzdChhcy5kaXN0KHQoKDEgLSBjb25nX2FsbF93KS8yKSkpJG9yZGVyCgojIHJlLW9yZGVyIG1hdHJpeCBhY2NvcmluZyB0byBjbHVzdGVyaW5nCmNvbmdfYWxsX3cgPC0gY29uZ19hbGxfd1tyb3cub3JkZXIsIGNvbC5vcmRlcl0gCgojIGZvciBzb21lIHJlYXNvbiByZXNoYXBlMjo6bWVsdCgpIHdvcmtzIGJldHRlciB0aGFuIGN1cnJlbnQgdGlkeXZlcnNlIGZ1bmN0aW9ucy4uLgpjb25nX2FsbF9vcmRlcmVkIDwtIG1lbHQoYXMubWF0cml4KGNvbmdfYWxsX3cpKSAlPiUKICByZW5hbWUoZmFjdG9yX0Ffb3JkZXJlZCA9IFZhcjEsIAogICAgICAgICBmYWN0b3JfQl9vcmRlcmVkID0gVmFyMiwKICAgICAgICAgY29uZyA9IHZhbHVlKSAlPiUKICBtdXRhdGUoZmFjdG9yX0EgPSBhcy5jaGFyYWN0ZXIoZmFjdG9yX0Ffb3JkZXJlZCksCiAgICAgICAgIGZhY3Rvcl9CID0gYXMuY2hhcmFjdGVyKGZhY3Rvcl9CX29yZGVyZWQpKSAlPiUKICBmdWxsX2pvaW4oY29uZ19hbGwgJT4lIHNlbGVjdChjb250YWlucygiX0EiKSkgJT4lIGRpc3RpbmN0KCkpICU+JQogIGZ1bGxfam9pbihjb25nX2FsbCAlPiUgc2VsZWN0KGNvbnRhaW5zKCJfQiIpKSAlPiUgZGlzdGluY3QoKSkgJT4lCiAgbXV0YXRlKGxhYl9BID0gcGFzdGUocGFzdGUoY291bnRyeV9BLCBhZ2VfZ3JvdXBfQSksIGZhY3Rvcl9sYWJkZXNjcmlwdF9BLCBzZXAgPSAiLCAiKSwKICAgICAgICAgbGFiX0IgPSBwYXN0ZShwYXN0ZShjb3VudHJ5X0IsIGFnZV9ncm91cF9CKSwgZmFjdG9yX2xhYmRlc2NyaXB0X0IsIHNlcCA9ICIsICIpKQojIG11dGF0ZShzYW1wbGVfQSA9IHBhc3RlKGNvdW50cnlfQSwgYWdlX2dyb3VwX0EsIHNlcCA9ICIsICIpLAojICAgICAgICBzYW1wbGVfQiA9IHBhc3RlKGNvdW50cnlfQiwgYWdlX2dyb3VwX0IsIHNlcCA9ICIsICIpLAojICAgICAgICBsYWJfQSA9IHBhc3RlKHNhbXBsZV9BLCBmYWN0b3JfbGFiZGVzY3JpcHRfQSwgc2VwID0gIiAiKSwKIyAgICAgICAgbGFiX0IgPSBwYXN0ZShzYW1wbGVfQiwgZmFjdG9yX2xhYmRlc2NyaXB0X0IsIHNlcCA9ICIgIikpCmBgYAoKYGBge3IgY29uZyBhbGwgcGFpcnMgcGxvdCwgZmlnLndpZHRoID0gOS41LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSAyCmNvbmdfbG93ZXJfbGltIDwtIGlmZWxzZShtaW4oY29uZ19hbGxfb3JkZXJlZCRjb25nKSA+IC0wLjA1LCAtMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oY29uZ19hbGxfb3JkZXJlZCRjb25nKSkKIyBjb25nX3Bsb3RfY29sb3JzIDwtIGMoInJlZDQiLCAiYmx1ZTQiLCAiZGFya29yY2hpZDQiLCAiYmxhY2siKQojIGNvbmdfcGxvdF9jb2xvcnMgPC0gYygiYmxhY2siLCAiYmxhY2siLCAiYmxhY2siLCAiYmxhY2siKQpjb25nX3Bsb3RfY29sb3JzIDwtIGMoInJlZDQiLCAicmVkNCIsICJyZWQ0IiwgImJsYWNrIikKCmNvbmdfYWxsX29yZGVyZWQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihsYWJfQSwgYXMubnVtZXJpYyhmYWN0b3JfQV9vcmRlcmVkKSksCiAgICAgICAgICAgICB5ID0gcmVvcmRlcihsYWJfQiwgYXMubnVtZXJpYyhkZXNjKGZhY3Rvcl9CX29yZGVyZWQpKSksCiAgICAgICAgICAgICBmaWxsID0gY29uZykpICsgCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQoY29uZywgMiksIG5zbWFsbCA9IDIpLAogICAgICAgICAgICAgICAgY29sb3IgPSBjYXNlX3doZW4oY29uZyA+IDAuODUgfiAiYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZyA+IDAuNzUgfiAiYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25nID4gMC42NSB+ICJjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZCIpKSwKICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgIyBib2R5LWxpa2UgZmFjdG9ycwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDUuNSwgeG1heCA9IDE1LjUsIHltaW4gPSAxNi41LCB5bWF4ID0gMjYuNSwKICAgICAgICAgICBjb2xvciA9IGNvbmdfcGxvdF9jb2xvcnNbMV0sIHNpemUgPSAxLjUsIGFscGhhID0gMCkgKwogICMgbWluZC1saWtlIGZhY3RvcnMKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxNS41LCB4bWF4ID0gMjUuNSwgeW1pbiA9IDYuNSwgeW1heCA9IDE2LjUsCiAgICAgICAgICAgY29sb3IgPSBjb25nX3Bsb3RfY29sb3JzWzJdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICAjIGhlYXJ0LWxpa2UgZmFjdG9ycwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDI1LjUsIHhtYXggPSAzMS41LCB5bWluID0gMC41LCB5bWF4ID0gNi41LAogICAgICAgICAgIGNvbG9yID0gY29uZ19wbG90X2NvbG9yc1szXSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwKSArCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXNfYyh0cmFucyA9IHNjYWxlczo6ZXhwX3RyYW5zKGJhc2UgPSBleHAoMSkpLAogICMgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhjb25nX2xvd2VyX2xpbSwgMSksIAogICMgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKGNvbmdfbG93ZXJfbGltLCAxLCAwLjA1KSwKICAjICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoZm9ybWF0KHNlcShjb25nX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgbnNtYWxsID0gMiksCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLjg1ID0gbW9kZXJhdGUiLCAiMC45MCIsIAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMC45NSA9IGhpZ2giLCAiMS4wMCIpLAogICMgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gInZpcmlkaXMiLAogICMgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA0MCkpICsKICBzY2FsZV9maWxsX2dyYWRpZW50bigjdHJhbnMgPSBzY2FsZXM6OmV4cF90cmFucyhiYXNlID0gZXhwKDEpKSwKICAgIGxpbWl0cyA9IGMoY29uZ19sb3dlcl9saW0sIDEpLCAKICAgIGJyZWFrcyA9IHNlcShjb25nX2xvd2VyX2xpbSwgMSwgMC4wNSksCiAgICBsYWJlbHMgPSBjKGZvcm1hdChzZXEoY29uZ19sb3dlcl9saW0sIDAuOCwgMC4wNSksIG5zbWFsbCA9IDIpLAogICAgICAgICAgICAgICAiMC44NSA9IG1vZGVyYXRlIiwgIjAuOTAiLCAKICAgICAgICAgICAgICAgIjAuOTUgPSBoaWdoIiwgIjEuMDAiKSwKICAgIGNvbG9ycyA9IHZpcmlkaXNMaXRlOjp2aXJpZGlzKDYpLAogICAgdmFsdWVzID0gYygwLCAwLjY1LCAwLjc1LCAwLjg1LCAwLjk1LCAxKSwKICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gNDApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImdyYXk2MCIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICAjIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLAogICAgICBhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgc2l6ZSA9IHNpemVfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGNvbmdfcGxvdF9jb2xvcnMpLAogICAgICBmYWNlICA9IGZhY2VfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EpKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gcmV2KHNpemVfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gY29uZ19wbG90X2NvbG9ycykpLAogICAgICBmYWNlICA9IHJldihmYWNlX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BKSkpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyMCksCiAgICAjIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSksCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2xpbmUoCiAgICAgIHNpemUgPSBzaXplX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGNvbmdfcGxvdF9jb2xvcnMpKSwKICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfbGluZSgKICAgICAgc2l6ZSA9IHJldihzaXplX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gY29uZ19wbG90X2NvbG9ycykpKSwKICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgwLjI1LCAiY20iKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gZXhwcmVzc2lvbihpdGFsaWMocltjXSkpKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDJfb2JsaXF1ZS5wbmciKQpgYGAKCiMjIEphY2NhcmQgU2ltaWxhcml0eQoKYGBge3IgamFjY2FyZCBhbGwgc2FtcGxlc30Kc3Ryb25nX2xvYWRfYWxsIDwtIGxvYWRpbmdzX2FkdWx0cyAlPiUKICBiaW5kX3Jvd3MobG9hZGluZ3NfY2hpbGRyZW4pICU+JQogIHNlbGVjdChjb3VudHJ5LCBhZ2VfZ3JvdXAsIGZhY3RvciwgY2FwYWNpdHksIGxvYWRpbmcpICU+JQogIG11dGF0ZShzdHJvbmdfbG9hZCA9IGlmZWxzZShsb2FkaW5nID49IDAuNSwgMSwgMCkpICU+JQogIHNlbGVjdCgtbG9hZGluZykKCmNyb3NzX2xvYWRfYWxsIDwtIHN0cm9uZ19sb2FkX2FsbCAlPiUKICBmaWx0ZXIoc3Ryb25nX2xvYWQgPT0gMSkgJT4lCiAgY291bnQoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSwgc3Ryb25nX2xvYWQpICU+JQogIGZpbHRlcihuID4gMSkgJT4lCiAgbXV0YXRlKGNyb3NzX2xvYWQgPSBUKSAlPiUKICBzZWxlY3QoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSwgY3Jvc3NfbG9hZCkKCnN0cm9uZ19ub25jcm9zc19sb2FkX2FsbCA8LSBzdHJvbmdfbG9hZF9hbGwgJT4lCiAgbGVmdF9qb2luKGNyb3NzX2xvYWRfYWxsKSAlPiUKICBmaWx0ZXIoaXMubmEoY3Jvc3NfbG9hZCkpCgpqYWNjYXJkX2FsbCA8LSBzdHJvbmdfbm9uY3Jvc3NfbG9hZF9hbGwgJT4lCiAgc2VsZWN0KGZhY3RvciwgY2FwYWNpdHksIHN0cm9uZ19sb2FkKSAlPiUKICBzcHJlYWQoZmFjdG9yLCBzdHJvbmdfbG9hZCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJjYXBhY2l0eSIpICU+JQogIHQoKSAlPiUKICBkaXN0KG1ldGhvZCA9ICJiaW5hcnkiLCBkaWFnID0gVCwgdXBwZXIgPSBUKSAlPiUKICBhcy5tYXRyaXgoKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfQSIpICU+JQogIGdhdGhlcihmYWN0b3JfQiwgamFjY2FyZCwgLWZhY3Rvcl9BKSAlPiUKICAjIGNvbXB1dGUgc2ltaWxhcml0eSBpbmRleCBpbnN0ZWFkIG9mIGRpc3RhbmNlCiAgbXV0YXRlKGphY2NhcmQgPSAxIC0gamFjY2FyZCkgJT4lCiAgbGVmdF9qb2luKGJpbmRfcm93cyhmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSkpKSAlPiUKICBsZWZ0X2pvaW4oYmluZF9yb3dzKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSksCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSkpCmBgYAoKYGBge3IgamFjY2FyZCBhbGwgcGFpcnMgZm9ybWF0fQojIG1ha2Ugd2lkZS1mb3JtIHZlcnNpb24gb2YgZGYKamFjY2FyZF9hbGxfdyA8LSBqYWNjYXJkX2FsbCAlPiUKICBzZWxlY3QoZmFjdG9yX0EsIGZhY3Rvcl9CLCBqYWNjYXJkKSAlPiUKICBzcHJlYWQoZmFjdG9yX0IsIGphY2NhcmQpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygiZmFjdG9yX0EiKQoKIyB0cmVhdCBkaXN0YW5jZSBtYXRyaXggYXMgaWYgaXQgd2VyZSB0aGUgY29ycmVsYXRpb24gbWF0cml4IGZvciBoY2x1c3QKcm93Lm9yZGVyIDwtIGhjbHVzdChhcy5kaXN0KCgxIC0gamFjY2FyZF9hbGxfdykvMikpJG9yZGVyCmNvbC5vcmRlciA8LSBoY2x1c3QoYXMuZGlzdCh0KCgxIC0gamFjY2FyZF9hbGxfdykvMikpKSRvcmRlcgoKIyByZS1vcmRlciBtYXRyaXggYWNjb3JpbmcgdG8gY2x1c3RlcmluZwpqYWNjYXJkX2FsbF93IDwtIGphY2NhcmRfYWxsX3dbcm93Lm9yZGVyLCBjb2wub3JkZXJdIAoKIyBmb3Igc29tZSByZWFzb24gcmVzaGFwZTI6Om1lbHQoKSB3b3JrcyBiZXR0ZXIgdGhhbiBjdXJyZW50IHRpZHl2ZXJzZSBmdW5jdGlvbnMuLi4KamFjY2FyZF9hbGxfb3JkZXJlZCA8LSBtZWx0KGFzLm1hdHJpeChqYWNjYXJkX2FsbF93KSkgJT4lCiAgcmVuYW1lKGZhY3Rvcl9BX29yZGVyZWQgPSBWYXIxLCAKICAgICAgICAgZmFjdG9yX0Jfb3JkZXJlZCA9IFZhcjIsCiAgICAgICAgIGphY2NhcmQgPSB2YWx1ZSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9BID0gYXMuY2hhcmFjdGVyKGZhY3Rvcl9BX29yZGVyZWQpLAogICAgICAgICBmYWN0b3JfQiA9IGFzLmNoYXJhY3RlcihmYWN0b3JfQl9vcmRlcmVkKSkgJT4lCiAgZnVsbF9qb2luKGphY2NhcmRfYWxsICU+JSBzZWxlY3QoY29udGFpbnMoIl9BIikpICU+JSBkaXN0aW5jdCgpKSAlPiUKICBmdWxsX2pvaW4oamFjY2FyZF9hbGwgJT4lIHNlbGVjdChjb250YWlucygiX0IiKSkgJT4lIGRpc3RpbmN0KCkpICU+JQogIG11dGF0ZShsYWJfQSA9IHBhc3RlKHBhc3RlKGNvdW50cnlfQSwgYWdlX2dyb3VwX0EpLCBmYWN0b3JfbGFiZGVzY3JpcHRfQSwgc2VwID0gIiwgIiksCiAgICAgICAgIGxhYl9CID0gcGFzdGUocGFzdGUoY291bnRyeV9CLCBhZ2VfZ3JvdXBfQiksIGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBzZXAgPSAiLCAiKSkKIyBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZShjb3VudHJ5X0EsIGFnZV9ncm91cF9BLCBzZXAgPSAiLCAiKSwKIyAgICAgICAgc2FtcGxlX0IgPSBwYXN0ZShjb3VudHJ5X0IsIGFnZV9ncm91cF9CLCBzZXAgPSAiLCAiKSwKIyAgICAgICAgbGFiX0EgPSBwYXN0ZShzYW1wbGVfQSwgZmFjdG9yX2xhYmRlc2NyaXB0X0EsIHNlcCA9ICIgIiksCiMgICAgICAgIGxhYl9CID0gcGFzdGUoc2FtcGxlX0IsIGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBzZXAgPSAiICIpKQpgYGAKCmBgYHtyIGphY2NhcmQgYWxsIHBhaXJzIHBsb3QsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmFzcCA9IDAuOX0KIyBGSUdVUkUgMiBlcXVpdmFsZW50CmphY2NhcmRfbG93ZXJfbGltIDwtIGlmZWxzZShtaW4oamFjY2FyZF9hbGxfb3JkZXJlZCRqYWNjYXJkKSA+IDAsIDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWluKGphY2NhcmRfYWxsX29yZGVyZWQkamFjY2FyZCkpCiMgamFjY2FyZF9wbG90X2NvbG9ycyA8LSBjKCJyZWQ0IiwgImJsdWU0IiwgImRhcmtvcmNoaWQ0IiwgImJsYWNrIikKIyBqYWNjYXJkX3Bsb3RfY29sb3JzIDwtIGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIikKamFjY2FyZF9wbG90X2NvbG9ycyA8LSBjKCJyZWQ0IiwgInJlZDQiLCAicmVkNCIsICJibGFjayIpCgpqYWNjYXJkX2FsbF9vcmRlcmVkICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobGFiX0EsIGFzLm51bWVyaWMoZmFjdG9yX0Ffb3JkZXJlZCkpLAogICAgICAgICAgICAgeSA9IHJlb3JkZXIobGFiX0IsIGFzLm51bWVyaWMoZGVzYyhmYWN0b3JfQl9vcmRlcmVkKSkpLAogICAgICAgICAgICAgZmlsbCA9IGphY2NhcmQpKSArIAogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY2FzZV93aGVuKAogICAgIyBqYWNjYXJkICVpbiUgYygwLCAxKSB+IGZvcm1hdChyb3VuZChqYWNjYXJkLCAwKSwgbnNtYWxsID0gMCksCiAgICBUUlVFIH4gZm9ybWF0KHJvdW5kKGphY2NhcmQsIDIpLCBuc21hbGwgPSAyKSksCiAgICBjb2xvciA9IGNhc2Vfd2hlbihqYWNjYXJkID49IDAuNzUgfiAiYSIsIAogICAgICAgICAgICAgICAgICAgICAgamFjY2FyZCA+PSAwLjUgfiAiYiIsCiAgICAgICAgICAgICAgICAgICAgICBqYWNjYXJkID49IDAuMjUgfiAiYyIsCiAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gImQiKSksCiAgICBzaG93LmxlZ2VuZCA9IEYpICsKICAjIG1pbmQtbGlrZSBhbmQgb3RoZXIgZmFjdG9ycwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDAuNSwgeG1heCA9IDE0LjUsIHltaW4gPSAxNy41LCB5bWF4ID0gMzEuNSwKICAgICAgICAgICBjb2xvciA9IGphY2NhcmRfcGxvdF9jb2xvcnNbMl0sIHNpemUgPSAxLjUsIGFscGhhID0gMCkgKwogICMgYm9keS1saWtlIGZhY3RvcnMKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxNC41LCB4bWF4ID0gMjQuNSwgeW1pbiA9IDcuNSwgeW1heCA9IDE3LjUsCiAgICAgICAgICAgY29sb3IgPSBqYWNjYXJkX3Bsb3RfY29sb3JzWzFdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICAjIGhlYXJ0LWxpa2UgZmFjdG9ycwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDI0LjUsIHhtYXggPSAzMS41LCB5bWluID0gMC41LCB5bWF4ID0gNy41LAogICAgICAgICAgIGNvbG9yID0gamFjY2FyZF9wbG90X2NvbG9yc1szXSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoI3RyYW5zID0gc2NhbGVzOjpleHBfdHJhbnMoYmFzZSA9IGV4cCgxKSksCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhqYWNjYXJkX2xvd2VyX2xpbSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKGphY2NhcmRfbG93ZXJfbGltLCAxLCAwLjA1KSwKICAgICAgICAgICAgICAgICAgICAgICAjIGxhYmVscyA9IGMoZm9ybWF0KHNlcShqYWNjYXJkX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIjAuODUgPSBtb2RlcmF0ZSIsICIwLjkwIiwKICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIjAuOTUgPSBoaWdoIiwgIjEuMDAiKSwKICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAidmlyaWRpcyIsIAogICAgICAgICAgICAgICAgICAgICAgICMgZGlyZWN0aW9uID0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA0MCkpICsKICAjIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKCN0cmFucyA9IHNjYWxlczo6ZXhwX3RyYW5zKGJhc2UgPSBleHAoMSkpLAogICMgICBsaW1pdHMgPSBjKGphY2NhcmRfbG93ZXJfbGltLCAxKSwgCiAgIyAgIGJyZWFrcyA9IHNlcShqYWNjYXJkX2xvd2VyX2xpbSwgMSwgMC4wNSksCiAgIyAgIGxhYmVscyA9IGMoZm9ybWF0KHNlcShqYWNjYXJkX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgbnNtYWxsID0gMiksCiAgIyAgICAgICAgICAgICAgIjAuODUgPSBtb2RlcmF0ZSIsICIwLjkwIiwgCiAgIyAgICAgICAgICAgICAgIjAuOTUgPSBoaWdoIiwgIjEuMDAiKSwKICAjICAgY29sb3JzID0gdmlyaWRpc0xpdGU6OnZpcmlkaXMoNiksCiAgIyAgIHZhbHVlcyA9IGMoMCwgMC42NSwgMC43NSwgMC44NSwgMC45NSwgMSksCiAgIyAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gNDApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImdyYXk2MCIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICAjIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLAogICAgICBhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgc2l6ZSA9IHNpemVfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oamFjY2FyZF9hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGphY2NhcmRfcGxvdF9jb2xvcnMpLAogICAgICBmYWNlICA9IGZhY2VfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EpKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gcmV2KHNpemVfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gamFjY2FyZF9wbG90X2NvbG9ycykpLAogICAgICBmYWNlICA9IHJldihmYWNlX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BKSkpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyMCksCiAgICAjIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSksCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2xpbmUoCiAgICAgIHNpemUgPSBzaXplX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oamFjY2FyZF9hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGphY2NhcmRfcGxvdF9jb2xvcnMpKSwKICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfbGluZSgKICAgICAgc2l6ZSA9IHJldihzaXplX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gamFjY2FyZF9wbG90X2NvbG9ycykpKSwKICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgwLjI1LCAiY20iKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gIkphY2NhcmRcbnNpbWlsYXJpdHkiKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDJfb2JsaXF1ZV9qYWNjYXJkLnBuZyIpCmBgYAoKIyMgRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29ucwoKYGBge3IgZGV2IGNvbXAgYWxsIHNpdGVzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMS4yfQojIEZJR1VSRSBTNSwgRklHVVJFIFM2LCBGSUdVUkUgUzcsIEZJR1VSRSBTOCwgRklHVVJFIFM5CnBsb3RfZ3JpZChoZWF0bWFwX2NvbXBfZnVuKAogIGVmYV9saXN0ID0gbGlzdChlZmFfdXNfYWR1bHRzLCBlZmFfdXNfY2hpbGRyZW4pLCBwYWRkaW5nID0gRiksCiAgZGV2X2NvbmdfcGxvdF9mdW4oY29uZ19kZl9jaGlsZHJlbiwgd2hpY2hfY291bnRyeSA9ICJVUyIsIHBhZGRpbmcgPSBUKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDEuNSksIGxhYmVscyA9ICJBVVRPIikKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwNV9vYmxpcXVlLnBuZyIpCgpwbG90X2dyaWQoaGVhdG1hcF9jb21wX2Z1bigKICBlZmFfbGlzdCA9IGxpc3QoZWZhX2doX2FkdWx0cywgZWZhX2doX2NoaWxkcmVuKSwgcGFkZGluZyA9IEYpLAogIGRldl9jb25nX3Bsb3RfZnVuKGNvbmdfZGZfY2hpbGRyZW4sIHdoaWNoX2NvdW50cnkgPSAiR2hhbmEiLCBwYWRkaW5nID0gVCksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygyLCAxLjUpLCBsYWJlbHMgPSAiQVVUTyIpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDZfb2JsaXF1ZS5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV90aF9hZHVsdHMsIGVmYV90aF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIlRoYWlsYW5kIiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA3X29ibGlxdWUucG5nIikKCnBsb3RfZ3JpZChoZWF0bWFwX2NvbXBfZnVuKAogIGVmYV9saXN0ID0gbGlzdChlZmFfY2hfYWR1bHRzLCBlZmFfY2hfY2hpbGRyZW4pLCBwYWRkaW5nID0gRiksCiAgZGV2X2NvbmdfcGxvdF9mdW4oY29uZ19kZl9jaGlsZHJlbiwgd2hpY2hfY291bnRyeSA9ICJDaGluYSIsIHBhZGRpbmcgPSBUKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDEuNSksIGxhYmVscyA9ICJBVVRPIikKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwOF9vYmxpcXVlLnBuZyIpCgpwbG90X2dyaWQoaGVhdG1hcF9jb21wX2Z1bigKICBlZmFfbGlzdCA9IGxpc3QoZWZhX3Z0X2FkdWx0cywgZWZhX3Z0X2NoaWxkcmVuKSwgcGFkZGluZyA9IEYpLAogIGRldl9jb25nX3Bsb3RfZnVuKGNvbmdfZGZfY2hpbGRyZW4sIHdoaWNoX2NvdW50cnkgPSAiVmFudWF0dSIsIHBhZGRpbmcgPSBUKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDEuNSksIGxhYmVscyA9ICJBVVRPIikKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwOV9vYmxpcXVlLnBuZyIpCmBgYAoKYGBge3IgbG9hZGluZ3MgYWxsIHNhbXBsZXMsIGZpZy53aWR0aCA9IDYuNSwgZmlnLmFzcCA9IDAuNn0KIyBGSUdVUkUgMQpoZWF0bWFwX2NvbXBfZnVuKGxpc3QoZWZhX3VzX2FkdWx0cywgZWZhX2doX2FkdWx0cywgZWZhX3RoX2FkdWx0cywgCiAgICAgICAgICAgICAgICAgICAgICBlZmFfY2hfYWR1bHRzLCBlZmFfdnRfYWR1bHRzLCAKICAgICAgICAgICAgICAgICAgICAgIGVmYV91c19jaGlsZHJlbiwgZWZhX2doX2NoaWxkcmVuLCBlZmFfdGhfY2hpbGRyZW4sIAogICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2NoaWxkcmVuLCBlZmFfdnRfY2hpbGRyZW4pLCAKICAgICAgICAgICAgICAgICBmYWNldF9vcmRlcl92YXJzID0gYygiYWdlX2dyb3VwIiwgImNvdW50cnkiLCAiZm51bSIpLAogICAgICAgICAgICAgICAgIGZhY2V0X2xhYl9zcGxpdCA9IFQpICsKICB0aGVtZShwYW5lbC5zcGFjaW5nLnggPSB1bml0KGMocmVwKDAuMiwgNCksIDEsIHJlcCgwLjIsIDQpKSwgImxpbmUiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSAzMCwgYmFyaGVpZ2h0ID0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkZhY3RvciBsb2FkaW5nIiwgdGl0bGUudmp1c3QgPSAxKSkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAxX29ibGlxdWUucG5nIikKYGBgCgpgYGB7ciBkb21pbmFudCBmYWN0b3IsIGZpZy53aWR0aCA9IDYuNSwgZmlnLmFzcCA9IDAuNiwgaW5jbHVkZSA9IEZ9CiMgaGlnaGxpZ2h0aW5nIGRvbWluYW50IGZhY3RvciAoaWdub3JpbmcgY3Jvc3MtbG9hZGluZ3MgPiAwLjA1KQpsb2FkaW5nc19hbGwgPC0gbG9hZGluZ3NfYWR1bHRzICU+JQogIHNlbGVjdCgtY29udGFpbnMoIm9yZCIpKSAlPiUKICBmdWxsX2pvaW4obG9hZGluZ3NfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgc2VsZWN0KC1jb250YWlucygib3JkIikpKQoKZG9tX2ZhY3RvcnNfYWxsIDwtIGxvYWRpbmdzX2FsbCAlPiUKICBncm91cF9ieShjb3VudHJ5LCBhZ2VfZ3JvdXAsIGNhcGFjaXR5KSAlPiUgCiAgdG9wX24oMSwgYWJzKGxvYWRpbmcpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGFnZV9ncm91cCwgY2FwYWNpdHksIGZhY3RvciwgbG9hZGluZykgJT4lCiAgcmVuYW1lKGRvbV9mYWN0b3IgPSBmYWN0b3IsCiAgICAgICAgIGRvbV9sb2FkaW5nID0gbG9hZGluZykKCnJlY3RfZGYgPC0gbG9hZGluZ3NfYWxsICU+JQogIGZ1bGxfam9pbihkb21fZmFjdG9yc19hbGwpICU+JQogIG11dGF0ZShmbnVtID0gZ3N1YigiLipfRiIsICJGIiwgZmFjdG9yKSkgJT4lCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgiZmFjdG9yIikpICU+JQogIHNwcmVhZChmbnVtLCBsb2FkaW5nKSAlPiUKICBtdXRhdGUoZGlmZjEgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEYxKSwKICAgICAgICAgZGlmZjIgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEYyKSwKICAgICAgICAgZGlmZjMgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEYzKSwKICAgICAgICAgZGlmZjQgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEY0KSkgJT4lCiAgc2VsZWN0KC1jKGRvbV9sb2FkaW5nLCBzdGFydHNfd2l0aCgiRiIpKSkgJT4lCiAgZ2F0aGVyKHdoaWNoX2RpZmYsIGRpZmYsIHN0YXJ0c193aXRoKCJkaWZmIikpICU+JQogIGZpbHRlcihkaWZmICE9IDAsICFpcy5uYShkaWZmKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSkgJT4lCiAgdG9wX24oLTEsIGRpZmYpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoYW55X3NtYWxsID0gZGlmZiA8IDAuMDUpICU+JQogIHJlbmFtZShmYWN0b3IgPSBkb21fZmFjdG9yKSAlPiUKICBsZWZ0X2pvaW4oZnVsbF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMsIGZhY3Rvcl9uYW1lc19jaGlsZHJlbikpCgojIGFuYWxvZyB0byBGSUdVUkUgMQp0ZW1wX2NhcF9vcmRlciA8LSBmYS5zb3J0KGVmYV91c19hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkgJT4lIHJldigpCgpnZ3Bsb3QocmVjdF9kZiAlPiUKICAgICAgICAgZmlsdGVyKCFpcy5uYShhbnlfc21hbGwpKSAlPiUKICAgICAgICAgbXV0YXRlKGNhcGFjaXR5ID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSB0ZW1wX2NhcF9vcmRlcikpLAogICAgICAgYWVzKHggPSBmYWN0b3JfbGFiZGVzY3JpcHQsIAogICAgICAgICAgIHkgPSBjYXBhY2l0eSwgCiAgICAgICAgICAgZmlsbCA9IGFueV9zbWFsbCkpICsKICBmYWNldF9ncmlkKH4gaW50ZXJhY3Rpb24oY291bnRyeSwgYWdlX2dyb3VwKSwgc3BhY2UgPSAiZnJlZSIsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21fdGlsZSgpICsKICB0aGVtZShwYW5lbC5zcGFjaW5nLnggPSB1bml0KGMocmVwKDAuMiwgNCksIDEsIHJlcCgwLjIsIDQpKSwgImxpbmUiKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCiMgZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAxdjJfb2JsaXF1ZS5wbmciKQpgYGAKCmBgYHtyIGxvYWRpbmdzIGFsbCBzYW1wbGVzIHYyLCBmaWcud2lkdGggPSA2LjUsIGZpZy5hc3AgPSAwLjZ9CiMgYWx0ZXJuYXRpdmUgdG8gRklHVVJFIDEKbG9hZGluZ3NfYWR1bHRzICU+JQogIGJpbmRfcm93cyhsb2FkaW5nc19jaGlsZHJlbikgJT4lCiAgIyBzZWxlY3QoLWNvbnRhaW5zKCJfb3JkIikpICU+JQogIG11dGF0ZShmYWN0b3JfYmhtID0gY2FzZV93aGVuKAogICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdCkpIH4gIkJPRFktbGlrZSBmYWN0b3JzIiwKICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHQpKSB+ICJNSU5ELWxpa2UgZmFjdG9ycyIsCiAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdCkpIH4gIkhFQVJULWxpa2UgZmFjdG9ycyIsCiAgICBUUlVFIH4gIk90aGVyIikpICU+JQogIGxlZnRfam9pbihzdHJvbmdfbm9uY3Jvc3NfbG9hZF9hbGwgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChmYWN0b3IsIGNhcGFjaXR5LCBzdHJvbmdfbG9hZCwgY3Jvc3NfbG9hZCkpICU+JQogIG11dGF0ZShmb250X2ZhY2UgPSBjYXNlX3doZW4oCiAgICBzdHJvbmdfbG9hZCA9PSAxICYgaXMubmEoY3Jvc3NfbG9hZCkgfiAiYm9sZCIsCiAgICBUUlVFIH4gInBsYWluIikpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocGFzdGUoZ3N1YigiRmFjdG9yICIsICJGIiwgZmFjdG9yX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9kZXNjcmlwdCwgc2VwID0gIjogIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgYXMubnVtZXJpYyhjb3VudHJ5KSksIAogICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHlfb3JkX3VzLCBkZXNjKGNhcGFjaXR5X29yZF91cykpLAogICAgICAgICAgICAgZmlsbCA9IGxvYWRpbmcpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhmYWN0b3JfYmhtLCBhZ2VfZ3JvdXApLCAKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4yKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMiksIAogICAgICAgICAgICAgICAgZm9udGZhY2UgPSBmb250X2ZhY2UpLCBzaXplID0gMykgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoYygwLjIsIDEsIDAuMiwgMSwgMC4yLCAxLCAwLjIpLCAibGluZSIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDMwLCBiYXJoZWlnaHQgPSAwLjUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiRmFjdG9yIGxvYWRpbmciLCB0aXRsZS52anVzdCA9IDEpKQogICMgc2VsZWN0KGNvdW50cnksIGNhcGFjaXR5LCBsb2FkaW5nKSAlPiUKICAjIG11dGF0ZShsb2FkaW5nID0gcm91bmQobG9hZGluZywgMikpICU+JQogICMgc3ByZWFkKGNvdW50cnksIGxvYWRpbmcpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWcwMXYyX29ibGlxdWUucG5nIikKYGBgCgojIyBPdGhlciBtZXRyaWNzIG9mIHNpbWlsYXJpdHkKCmBgYHtyfQpsb2FkaW5nc19hZHVsdHMgJT4lCiAgZmlsdGVyKGZhY3RvciA9PSAidXNBRFVMVFNfRjEiKSAlPiUKICBmaWx0ZXIobG9hZGluZyA+PSAwLjUwKQoKbG9hZGluZ3NfYWR1bHRzICU+JQogIGJpbmRfcm93cyhsb2FkaW5nc19jaGlsZHJlbikgJT4lCiAgIyBmaWx0ZXIoZ3JlcGwoImJvZHkiLCBmYWN0b3JfZGVzY3JpcHQpKSAlPiUKICBzZWxlY3QoY291bnRyeSwgZmFjdG9yLCBjYXBhY2l0eSwgbG9hZGluZykgJT4lCiAgZmlsdGVyKGxvYWRpbmcgPj0gMC41MCkgJT4lCiAgY291bnQoY291bnRyeSwgZmFjdG9yKQpgYGAKCmBgYHtyfQpzdHJvbmdfbG9hZGluZ3MgPC0gbG9hZGluZ3NfYWxsICU+JQogIHNlbGVjdChmYWN0b3IsIGNhcGFjaXR5LCBsb2FkaW5nKSAlPiUKICBtdXRhdGUoc3Ryb25nX2xvYWQgPSBpZmVsc2UobG9hZGluZyA+PSAwLjUsIDEsIDApKSAlPiUKICBzZWxlY3QoLWxvYWRpbmcpICU+JQogIHNwcmVhZChmYWN0b3IsIHN0cm9uZ19sb2FkKQpgYGAKCmBgYHtyfQpjb21wYXJlX2Z1biA8LSBmdW5jdGlvbih4LCB5KSB7CiAgcmVzIDwtIHggPT0geQogIHJlcyA8LSBzdW0ocmVzKS9sZW5ndGgoeCkKICByZXR1cm4ocmVzKQp9CmBgYAoKYGBge3J9CmNvbXBhcmVfZnVuKHN0cm9uZ19sb2FkaW5ncyRjaEFEVUxUU19GMSwgc3Ryb25nX2xvYWRpbmdzJGNoQURVTFRTX0YyKQpgYGAKCmBgYHtyfQpiaW5fc2ltIDwtIGxvYWRpbmdzX2FsbCAlPiUKICBzZWxlY3QoZmFjdG9yLCBjYXBhY2l0eSwgbG9hZGluZykgJT4lCiAgbXV0YXRlKHN0cm9uZ19sb2FkID0gaWZlbHNlKGxvYWRpbmcgPj0gMC41LCAxLCAwKSkgJT4lCiAgc2VsZWN0KC1sb2FkaW5nKSAlPiUKICBzcHJlYWQoZmFjdG9yLCBzdHJvbmdfbG9hZCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJjYXBhY2l0eSIpICU+JQogIHQoKSAlPiUKICBkaXN0KG1ldGhvZCA9ICJiaW5hcnkiLCBkaWFnID0gVCwgdXBwZXIgPSBUKSAlPiUKICBhcy5tYXRyaXgoKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfQSIpICU+JQogIGdhdGhlcihmYWN0b3JfQiwgYmluX3NpbSwgLWZhY3Rvcl9BKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoYmluX3NpbSwgCiAgICAgICBhZXMoeCA9IGZhY3Rvcl9BLCB5ID0gZmFjdG9yX0IsIGZpbGwgPSBiaW5fc2ltKSkgKwogIGdlb21fdGlsZSgpCmBgYAoKYGBge3J9CnN0cm9uZ19sb2FkX2Z1biA8LSBmdW5jdGlvbih3aGljaF9iYXNlLCB3aGljaF9iaG0sIHdoaWNoX2FnZV9ncm91cCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRvZmYpIHsKICBkZiA8LSBsb2FkaW5nc19hZHVsdHMgJT4lCiAgICBiaW5kX3Jvd3MobG9hZGluZ3NfY2hpbGRyZW4pICU+JQogICAgZmlsdGVyKGdyZXBsKHdoaWNoX2JobSwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHQpKSkgJT4lCiAgICBzZWxlY3QoY2FwYWNpdHksIGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBzcHJlYWQoZmFjdG9yLCBsb2FkaW5nKSAlPiUKICAgIGZpbHRlcl9hdCh2YXJzKC1jYXBhY2l0eSksIGFueV92YXJzKC4gPiBjdXRvZmYpKSAlPiUKICAgIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkgJT4lCiAgICBtdXRhdGUoc3Ryb25nX2xvYWQgPSBpZmVsc2UobG9hZGluZyA+IGN1dG9mZiwgVCwgRikpICU+JQogICAgY291bnQoZmFjdG9yLCBzdHJvbmdfbG9hZCkgJT4lCiAgICBncm91cF9ieShmYWN0b3IpICU+JQogICAgbXV0YXRlKHByb3Bfc3Ryb25nX2xvYWQgPSBuL3N1bShuKSkgJT4lCiAgICBmaWx0ZXIoc3Ryb25nX2xvYWQgPT0gVCkgJT4lCiAgICBzZWxlY3QoZmFjdG9yLCBwcm9wX3N0cm9uZ19sb2FkKSAlPiUKICAgIGxlZnRfam9pbihmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cywgZmFjdG9yX25hbWVzX2NoaWxkcmVuKSkgJT4lCiAgICBtdXRhdGUoZmFjdG9yX2JobSA9IGNhc2Vfd2hlbigKICAgICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdCkpIH4gIkJPRFktbGlrZSBmYWN0b3JzIiwKICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdCkpIH4gIk1JTkQtbGlrZSBmYWN0b3JzIiwKICAgICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHQpKSB+ICJIRUFSVC1saWtlIGZhY3RvcnMiLAogICAgICBUUlVFIH4gIk90aGVyIikpICU+JQogICAgZmlsdGVyKGFzLmNoYXJhY3RlcihhZ2VfZ3JvdXApICVpbiUgd2hpY2hfYWdlX2dyb3VwKQogIAogIHJldHVybihkZikKfQpgYGAKCmBgYHtyfQpzdHJvbmdfbG9hZF9wbG90X2Z1biA8LSBmdW5jdGlvbihzdHJvbmdfZGYsIHdoaWNoX2JobSkgewogIGcgPC0gc3Ryb25nX2RmICU+JQogICAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihmYWN0b3IsIGFzLm51bWVyaWMoY291bnRyeSkpLCAKICAgICAgICAgICAgICAgeSA9IHByb3Bfc3Ryb25nX2xvYWQsIGZpbGwgPSBjb3VudHJ5KSkgKwogICAgZmFjZXRfZ3JpZCguIH4gZmFjdG9yX2JobSwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWVfeCIpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSkpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZTAodG91cHBlcih3aGljaF9iaG0pLCAiLWxpa2UgZmFjdG9ycyIpKSAKICAKICByZXR1cm4oZykKfQpgYGAKCmBgYHtyfQpzdHJvbmdfbG9hZF9mdW4od2hpY2hfYmhtID0gImJvZHkiLCB3aGljaF9hZ2VfZ3JvdXAgPSAiYWR1bHRzIiwgY3V0b2ZmID0gMC41KQpzdHJvbmdfbG9hZF9mdW4od2hpY2hfYmhtID0gImhlYXJ0Iiwgd2hpY2hfYWdlX2dyb3VwID0gImFkdWx0cyIsIGN1dG9mZiA9IDAuNSkKc3Ryb25nX2xvYWRfZnVuKHdoaWNoX2JobSA9ICJtaW5kIiwgd2hpY2hfYWdlX2dyb3VwID0gImFkdWx0cyIsIGN1dG9mZiA9IDAuNSkKYGBgCgoKYGBge3J9CnN0cm9uZ19sb2FkX2Z1bih3aGljaF9iaG0gPSAiYm9keSIsIHdoaWNoX2FnZV9ncm91cCA9ICJhZHVsdHMiLCBjdXRvZmYgPSAwLjUpICU+JQogIHN0cm9uZ19sb2FkX3Bsb3RfZnVuKHdoaWNoX2JobSA9ICJib2R5IikKc3Ryb25nX2xvYWRfZnVuKHdoaWNoX2JobSA9ICJoZWFydCIsIHdoaWNoX2FnZV9ncm91cCA9ICJhZHVsdHMiLCBjdXRvZmYgPSAwLjUpCnN0cm9uZ19sb2FkX2Z1bih3aGljaF9iaG0gPSAibWluZCIsIHdoaWNoX2FnZV9ncm91cCA9ICJhZHVsdHMiLCBjdXRvZmYgPSAwLjUpCmBgYAoKCiMjIFZhcmlhbmNlIGFjY291bnRlZCBmb3IKCmBgYHtyfQpWYWNjb3VudGVkX2Z1biA8LSBmdW5jdGlvbihlZmFfbmFtZSkgewogIGNvdW50cnkgPC0gZ3N1YigiZWZhXyIsICIiLCBlZmFfbmFtZSkKICBjb3VudHJ5IDwtIGdzdWIoIl8uKiQiLCAiIiwgY291bnRyeSkKICBhZ2VfZ3JvdXAgPC0gY2FzZV93aGVuKGdyZXBsKCJhZHVsdCIsIGVmYV9uYW1lKSB+ICJhZHVsdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImNoaWxkIiwgZWZhX25hbWUpIH4gImNoaWxkcmVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKQogIAogIGVmYSA8LSBnZXQoZWZhX25hbWUpCiAgcmVzIDwtIGVmYSRWYWNjb3VudGVkICU+JQogICAgZGF0YS5mcmFtZSgpICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJtZXRyaWMiKSAlPiUKICAgIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2giLCAidGgiLCAiY2giLCAidnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgICBhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwLCBsZXZlbHMgPSBjKCJhZHVsdHMiLCAiY2hpbGRyZW4iKSkpCiAgCiAgcmV0dXJuKHJlcykKfQpgYGAKCmBgYHtyfQpWYWNjb3VudGVkX2FsbCA8LSBWYWNjb3VudGVkX2Z1bigiZWZhX3VzX2FkdWx0cyIpICU+JQogIGZ1bGxfam9pbihWYWNjb3VudGVkX2Z1bigiZWZhX2doX2FkdWx0cyIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV90aF9hZHVsdHMiKSkgJT4lCiAgZnVsbF9qb2luKFZhY2NvdW50ZWRfZnVuKCJlZmFfY2hfYWR1bHRzIikpICU+JQogIGZ1bGxfam9pbihWYWNjb3VudGVkX2Z1bigiZWZhX3Z0X2FkdWx0cyIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV91c19jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV9naF9jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV90aF9jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV9jaF9jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV92dF9jaGlsZHJlbiIpKQpgYGAKCmBgYHtyfQpWYWNjb3VudGVkX2FsbCAlPiUKICBmaWx0ZXIobWV0cmljICVpbiUgYygiUHJvcG9ydGlvbiBWYXIiLCAiUHJvcG9ydGlvbiBFeHBsYWluZWQiKSkgJT4lCiAgZ2F0aGVyKGZhY3RvciwgdmFsdWUsIHN0YXJ0c193aXRoKCJGIikpICU+JQogIG11dGF0ZSh2YWx1ZSA9IHJvdW5kKHZhbHVlLCAyKSkgJT4lCiAgc3ByZWFkKGNvdW50cnksIHZhbHVlKSAlPiUKICBhcnJhbmdlKGFnZV9ncm91cCwgZmFjdG9yLCBtZXRyaWMpCmBgYApgYGB7cn0KVmFjY291bnRlZF9hbGwgJT4lCiAgZmlsdGVyKG1ldHJpYyA9PSAiQ3VtdWxhdGl2ZSBWYXIiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCB2YWx1ZSwgc3RhcnRzX3dpdGgoIkYiKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlX2dyb3VwKSAlPiUKICB0b3BfbigxLCB2YWx1ZSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh2YWx1ZSA9IHJvdW5kKHZhbHVlLCAyKSkgJT4lCiAgc2VsZWN0KG1ldHJpYywgY291bnRyeSwgYWdlX2dyb3VwLCB2YWx1ZSkgJT4lCiAgc3ByZWFkKGNvdW50cnksIHZhbHVlKSAlPiUKICBhcnJhbmdlKGFnZV9ncm91cCwgbWV0cmljKQpgYGAKIyMgSW50ZXJmYWN0b3IgY29ycmVsYXRpb25zCgpgYGB7cn0KaW50ZXJmYWN0b3JfY29yX2Z1biA8LSBmdW5jdGlvbihlZmFfbmFtZSkgewogIHNhbXBsZSA9IGdzdWIoImVmYV8iLCAiIiwgZWZhX25hbWUpCiAgY291bnRyeSA9IGdzdWIoIl8uKiQiLCAiIiwgc2FtcGxlKQogIGFnZV9ncm91cCA9IGdzdWIoIl4uKl8iLCAiIiwgc2FtcGxlKQogIAogIGVmYSA8LSBnZXQoZWZhX25hbWUpCiAgCiAgIyBoYWNreSwgbm90IHN1cmUgd2h5IHRoaXMgd29ya3MsIGJ1dCBpdCdzIHRoZSBvbmx5IHdheSBpIGNvdWxkIGdldCBDSXMKICBkZiA8LSBwcmludChlZmEpICU+JQogICAgZGF0YS5mcmFtZSgpICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfcGFpciIpICU+JQogICAgc2VwYXJhdGUoZmFjdG9yX3BhaXIsIGMoImZhY3Rvcl9BIiAsImZhY3Rvcl9CIiksIHNlcCA9ICItIikgJT4lCiAgICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZmFjdG9yIikpLCB+IGdzdWIoIl4uKl8iLCAiIiwgLikpCiAgCiAgIyBkZiA8LSBlZmEkUGhpICU+JQogICMgICBkYXRhLmZyYW1lKCkgJT4lCiAgIyAgIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKQogICMgZ2F0aGVyKGZhY3Rvcl9CLCBwaGksIC1mYWN0b3JfQSkKICAKICBkZiA8LSBkZiAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZmFjdG9yIikpLAogICAgICAgICAgICB+IHBhc3RlMChjb3VudHJ5LCB0b3VwcGVyKGFnZV9ncm91cCksICJfIiwgLikpICU+JQogICAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoIiwgInRoIiwgImNoIiwgInZ0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgICAgYWdlX2dyb3VwID0gZmFjdG9yKGFnZV9ncm91cCwgbGV2ZWxzID0gYygiYWR1bHRzIiwgImNoaWxkcmVuIikpKQogIAogIHJldHVybihkZikKfQpgYGAKCmBgYHtyLCByZXN1bHRzID0gImhpZGUifQpkX3BoaSA8LSBiaW5kX3Jvd3MoaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3VzX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX2doX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3RoX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX2NoX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3Z0X2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3VzX2NoaWxkcmVuIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfZ2hfY2hpbGRyZW4iKSwKICAgICAgICAgICAgICAgICAgIGludGVyZmFjdG9yX2Nvcl9mdW4oImVmYV90aF9jaGlsZHJlbiIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX2NoX2NoaWxkcmVuIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfdnRfY2hpbGRyZW4iKSkKYGBgCmBgYHtyfQpkX3BoaSA8LSBkX3BoaSAlPiUKICBmdWxsX2pvaW4oZF9waGkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+IGdzdWIoImZhY3Rvcl9BIiwgImZhY3Rvcl9DIiwgLikpICU+JQogICAgICAgICAgICAgIHJlbmFtZV9hbGwofiBnc3ViKCJmYWN0b3JfQiIsICJmYWN0b3JfRCIsIC4pKSAlPiUKICAgICAgICAgICAgICByZW5hbWVfYWxsKH4gZ3N1YigiZmFjdG9yX0QiLCAiZmFjdG9yX0EiLCAuKSkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+IGdzdWIoImZhY3Rvcl9DIiwgImZhY3Rvcl9CIiwgLikpKSAlPiUgZGlzdGluY3QoKQpgYGAKCmBgYHtyfQpkX3BoaSA8LSBkX3BoaSAlPiUKICBzZWxlY3QoLWNvdW50cnksIC1hZ2VfZ3JvdXApICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgIGZ1bGxfam9pbihmYWN0b3JfbmFtZXNfY2hpbGRyZW4pICU+JQogICAgICAgICAgICAgIHJlbmFtZV9hbGwofnBhc3RlMCguLCAiX0EiKSkpICU+JQogIG11dGF0ZShmYWN0b3JfYmhtX0EgPSBjYXNlX3doZW4oCiAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSB+ICJCb2R5LWxpa2UgZmFjdG9yIiwKICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIk1pbmQtbGlrZSBmYWN0b3IiLAogICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIkhlYXJ0LWxpa2UgZmFjdG9yIiwKICAgIFRSVUUgfiAiT3RoZXIiKSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgZnVsbF9qb2luKGZhY3Rvcl9uYW1lc19jaGlsZHJlbikgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+cGFzdGUwKC4sICJfQiIpKSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9iaG1fQiA9IGNhc2Vfd2hlbigKICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkJvZHktbGlrZSBmYWN0b3IiLAogICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSkgfiAiTWluZC1saWtlIGZhY3RvciIsCiAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSkgfiAiSGVhcnQtbGlrZSBmYWN0b3IiLAogICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICBtdXRhdGVfYXQodmFycyhmYWN0b3JfYmhtX0EsIGZhY3Rvcl9iaG1fQiksCiAgICAgICAgICAgIH4gZmFjdG9yKC4sIGxldmVscyA9IGMoIkJvZHktbGlrZSBmYWN0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFydC1saWtlIGZhY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbmQtbGlrZSBmYWN0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdGhlciIpKSkgJT4lCiAgc2VsZWN0KC1jb3VudHJ5X0IsIC1hZ2VfZ3JvdXBfQikgJT4lCiAgcmVuYW1lKGNvdW50cnkgPSBjb3VudHJ5X0EsIGFnZV9ncm91cCA9IGFnZV9ncm91cF9BKQpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDF9CmRfcGhpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3Rvcl9iaG1fQSwgCiAgICAgICAgICAgICB5ID0gcmVvcmRlcihmYWN0b3JfYmhtX0IsIGRlc2MoZmFjdG9yX2JobV9CKSksIAogICAgICAgICAgICAgZmlsbCA9IGVzdGltYXRlKSkgKwogIGZhY2V0X2dyaWQoY291bnRyeSB+IGFnZV9ncm91cCwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGVzdGltYXRlLCAyKSwgbnNtYWxsID0gMikpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSBxdW90ZShwaGkpKQpgYGAKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjZ9CmRfcGhpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3Rvcl9iaG1fQSwgCiAgICAgICAgICAgICBjb2xvciA9IGNvdW50cnksCiAgICAgICAgICAgICAjIHNoYXBlID0gYWdlX2dyb3VwLAogICAgICAgICAgICAgeSA9IGVzdGltYXRlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDUsIGNvbG9yID0gImdyYXk1MCIpICsKICBmYWNldF9ncmlkKGFnZV9ncm91cCB+IGZhY3Rvcl9iaG1fQiwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSAyKSArCiAgIyBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGVzdGltYXRlLCAyKSwgbnNtYWxsID0gMikpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoTkEsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gcXVvdGUocGhpKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuN30KZF9waGkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgCiAgICAgICAgICAgICBjb2xvciA9IGNvdW50cnksCiAgICAgICAgICAgICBncm91cCA9IGFnZV9ncm91cCwgc2hhcGUgPSBhZ2VfZ3JvdXAsCiAgICAgICAgICAgICB5ID0gZXN0aW1hdGUpKSArCiAgZmFjZXRfZ3JpZChmYWN0b3JfYmhtX0EgfiBmYWN0b3JfYmhtX0IsIHNjYWxlcyA9ICJmcmVlX3giLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIsIGNvbG9yID0gImdyZXk1MCIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICAjIGdlb21fdGV4dChhZXMoeSA9IGlmZWxzZShhZ2VfZ3JvdXAgPT0gImFkdWx0cyIsIAogICMgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlICsgMC4xLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlIC0gMC4wNSksCiAgIyAgICAgICAgICAgICAgIGxhYmVsID0gZm9ybWF0KHJvdW5kKGVzdGltYXRlLCAyKSwgbnNtYWxsID0gMikpLAogICMgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoTkEsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gcXVvdGUocGhpKSwgCiAgICAgICBzaGFwZSA9ICJBZ2UgZ3JvdXAiLCBzaXplID0gIkFnZSBncm91cCIsIAogICAgICAgY29sb3IgPSAiU2l0ZSIpCmBgYAoKYGBge3J9CmNhdCgiVVMgQURVTFRTXG4iKQplZmFfdXNfYWR1bHRzJFBoaQooZWZhX3VzX2FkdWx0cyRQaGkpXjIKCmNhdCgiXG5VUyBDSElMRFJFTlxuIikKZWZhX3VzX2NoaWxkcmVuJFBoaQooZWZhX3VzX2NoaWxkcmVuJFBoaSleMgpgYGAKCmBgYHtyfQpjYXQoIkdIQU5BIEFEVUxUU1xuIikKZWZhX2doX2FkdWx0cyRQaGkKKGVmYV9naF9hZHVsdHMkUGhpKV4yCgpjYXQoIlxuR0hBTkEgQ0hJTERSRU5cbiIpCmVmYV9naF9jaGlsZHJlbiRQaGkKKGVmYV9naF9jaGlsZHJlbiRQaGkpXjIKYGBgCgpgYGB7cn0KY2F0KCJUSEFJTEFORCBBRFVMVFNcbiIpCmVmYV90aF9hZHVsdHMkUGhpCihlZmFfdGhfYWR1bHRzJFBoaSleMgoKY2F0KCJcblRIQUlMQU5EIENISUxEUkVOXG4iKQplZmFfdGhfY2hpbGRyZW4kUGhpCihlZmFfdGhfY2hpbGRyZW4kUGhpKV4yCmBgYAoKYGBge3J9CmNhdCgiQ0hJTkEgQURVTFRTXG4iKQplZmFfY2hfYWR1bHRzJFBoaQooZWZhX2NoX2FkdWx0cyRQaGkpXjIKCmNhdCgiXG5DSElOQSBDSElMRFJFTlxuIikKZWZhX2NoX2NoaWxkcmVuJFBoaQooZWZhX2NoX2NoaWxkcmVuJFBoaSleMgpgYGAKCmBgYHtyfQpjYXQoIlZBTlVBVFUgQURVTFRTXG4iKQplZmFfdnRfYWR1bHRzJFBoaQooZWZhX3Z0X2FkdWx0cyRQaGkpXjIKCmNhdCgiXG5WQU5VQVRVIENISUxEUkVOXG4iKQplZmFfdnRfY2hpbGRyZW4kUGhpCihlZmFfdnRfY2hpbGRyZW4kUGhpKV4yCmBgYAoKYGBge3J9CgpgYGAKCgo=